/** * Copyright 2015 Confluent Inc. * * 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 io.confluent.kafka.schemaregistry.client.rest.utils; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; /** * This class manages a set of urls for accessing an upstream registry. It basically * maintains a pointer to a known good url which can be accessed through {@link #current()}. * When a request against the current url fails, the {@link #fail(String)} method is invoked, * and we'll move on to the next url (returning back to the start if we have to). */ public class UrlList { private final AtomicInteger index; private final List<String> urls; public UrlList(List<String> urls) { if (urls == null || urls.isEmpty()) { throw new IllegalArgumentException("Expected at least one URL to be passed in constructor"); } this.urls = new ArrayList<String>(urls); this.index = new AtomicInteger(new Random().nextInt(urls.size())); } public UrlList(String url) { this(Arrays.asList(url)); } /** * Get the current url * * @return the url */ public String current() { return urls.get(index.get()); } /** * Declare the given url as failed. This will cause the urls to * rotate, so that the next request will be done against a new url * (if one exists). * * @param url the url that has failed */ public void fail(String url) { int currentIndex = index.get(); if (urls.get(currentIndex).equals(url)) { index.compareAndSet(currentIndex, (currentIndex + 1) % urls.size()); } } /** * The number of unique urls contained in this collection. * * @return the count of urls */ public int size() { return urls.size(); } @Override public String toString() { return urls.toString(); } }