/**
 * 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.openejb.server.discovery;

import java.util.concurrent.CountDownLatch;
import java.util.HashSet;
import java.util.Set;

/**
 * @version $Rev$ $Date$
 */
public class EchoNet {

    public static void _main(final String[] args) throws Exception {
        final MultipointServer a = new MultipointServer(1111, new Tracker.Builder().build()).start();
        final MultipointServer b = new MultipointServer(3333, new Tracker.Builder().build()).start();
        a.connect(b);
        b.connect(a);
        a.connect(b);
        b.connect(a);
        a.connect(b);
        b.connect(a);
        a.connect(b);
        b.connect(a);
    }

    public static void main(final String[] args) throws Exception {

        final int multiple = 1;
        final int base = 2000;
//        final int multiple = 1111;
//        final int base = 1;

        int servers = 50;

        if (args.length > 0)
            servers = Integer.parseInt(args[0]);

        if (servers < 1) {
            System.out.println("number of servers must be greater than zero");
            return;
        }

        // get out of the 1000 port range
        servers += base;

        MultipointServer lastServer = null;
        for (int i = base; i < servers; i++) {
            final MultipointServer newServer = new MultipointServer(multiple * i, new Tracker.Builder().build()).start();

            if (lastServer != null)
                newServer.connect(lastServer);

            lastServer = newServer;
        }

        new CountDownLatch(1).await();
    }


    public static class Calc {
        public static void main(final String[] args) {
            final Set<Item> set = new HashSet<Item>();

            final int x = 150;

            for (int i = 1; i <= x; i++) {
                for (int j = 1; j <= x; j++) {
                    if (i == j) continue;

                    final Item item = new Item(i, j);
                    final boolean b = set.add(item);
//                    if (b) System.out.println("item = " + item);
                }
            }

            // 100 4950
            System.out.println(x + " ? " + 2 + " = " + set.size());
        }


        static class Item {
            int a;
            int b;

            Item(final int a, final int b) {
                this.a = a;
                this.b = b;
            }

            @Override
            public boolean equals(final Object o) {
                if (o == null || getClass() != o.getClass()) return false;

                final Item set = (Item) o;

                if (a == set.a && b == set.b) return true;
                if (a == set.b && b == set.a) return true;

                return false;
            }

            @Override
            public int hashCode() {
                return 1;
            }

            @Override
            public String toString() {
                return a + " " + b;
            }
        }
    }
}

