com.mycelium.net.ServerEndpoints.java Source code

Java tutorial

Introduction

Here is the source code for com.mycelium.net.ServerEndpoints.java

Source

/*
 * Copyright 2013, 2014 Megion Research and Development GmbH
 *
 * Licensed under the Microsoft Reference Source License (MS-RSL)
 *
 * This license governs use of the accompanying software. If you use the software, you accept this license.
 * If you do not accept the license, do not use the software.
 *
 * 1. Definitions
 * The terms "reproduce," "reproduction," and "distribution" have the same meaning here as under U.S. copyright law.
 * "You" means the licensee of the software.
 * "Your company" means the company you worked for when you downloaded the software.
 * "Reference use" means use of the software within your company as a reference, in read only form, for the sole purposes
 * of debugging your products, maintaining your products, or enhancing the interoperability of your products with the
 * software, and specifically excludes the right to distribute the software outside of your company.
 * "Licensed patents" means any Licensor patent claims which read directly on the software as distributed by the Licensor
 * under this license.
 *
 * 2. Grant of Rights
 * (A) Copyright Grant- Subject to the terms of this license, the Licensor grants you a non-transferable, non-exclusive,
 * worldwide, royalty-free copyright license to reproduce the software for reference use.
 * (B) Patent Grant- Subject to the terms of this license, the Licensor grants you a non-transferable, non-exclusive,
 * worldwide, royalty-free patent license under licensed patents for reference use.
 *
 * 3. Limitations
 * (A) No Trademark License- This license does not grant you any rights to use the Licensors name, logo, or trademarks.
 * (B) If you begin patent litigation against the Licensor over patents that you think may apply to the software
 * (including a cross-claim or counterclaim in a lawsuit), your license to the software ends automatically.
 * (C) The software is licensed "as-is." You bear the risk of using it. The Licensor gives no express warranties,
 * guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot
 * change. To the extent permitted under your local laws, the Licensor excludes the implied warranties of merchantability,
 * fitness for a particular purpose and non-infringement.
 */

package com.mycelium.net;

import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;

import java.util.ArrayList;
import java.util.Random;

public class ServerEndpoints {

    final private ArrayList<HttpEndpoint> endpoints;
    private int currentEndpoint;
    private ServerEndpointType allowedEndpointTypes = ServerEndpointType.ONLY_HTTPS;

    public ServerEndpoints(HttpEndpoint endpoints[]) {
        this.endpoints = Lists.newArrayList(endpoints);
        currentEndpoint = new Random().nextInt(this.endpoints.size());
        // ensure correct kind of endpoint
        switchToNextEndpoint();
    }

    public ServerEndpoints(HttpEndpoint endpoints[], int initialEndpoint) {
        this.endpoints = Lists.newArrayList(endpoints);

        Preconditions.checkElementIndex(initialEndpoint, endpoints.length);
        currentEndpoint = initialEndpoint;
    }

    public HttpEndpoint getCurrentEndpoint() {
        return endpoints.get(currentEndpoint);
    }

    public int getCurrentEndpointIndex() {
        return currentEndpoint;
    }

    public synchronized HttpEndpoint switchToNextEndpoint() {
        HttpEndpoint selectedEndpoint;
        int cnt = 0;
        do {
            currentEndpoint++;
            if (currentEndpoint >= endpoints.size()) {
                currentEndpoint = 0;
            }
            selectedEndpoint = endpoints.get(currentEndpoint);
            cnt++;
            if (cnt > endpoints.size()) {
                throw new RuntimeException("No valid next Endpoint found, " + allowedEndpointTypes.toString());
            }
        } while (!allowedEndpointTypes.isValid(selectedEndpoint.getClass()));

        return selectedEndpoint;
    }

    public void setAllowedEndpointTypes(ServerEndpointType types) {
        allowedEndpointTypes = types;
        switchToNextEndpoint();
    }

    public void setTorManager(TorManager torManager) {
        for (HttpEndpoint e : endpoints) {
            if (e instanceof TorHttpsEndpoint) {
                ((TorHttpsEndpoint) e).setTorManager(torManager);
            }
        }
    }
}