ForwarderManager.java revision c6a341d34c690c2b5948977cd803ec2ff668c4b7
156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski/*
256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * Copyright (C) 2010 The Android Open Source Project
356d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski *
456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * Licensed under the Apache License, Version 2.0 (the "License");
556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * you may not use this file except in compliance with the License.
656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * You may obtain a copy of the License at
756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski *
856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski *      http://www.apache.org/licenses/LICENSE-2.0
956d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski *
1056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * Unless required by applicable law or agreed to in writing, software
1156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * distributed under the License is distributed on an "AS IS" BASIS,
1256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1356d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * See the License for the specific language governing permissions and
1456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * limitations under the License.
1556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski */
1656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
1756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowskipackage com.android.dumprendertree2.forwarder;
1856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
19c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.net.MalformedURLException;
20c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.net.URL;
2156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowskiimport java.util.HashSet;
2256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowskiimport java.util.Set;
2356d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
2456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski/**
2556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * A simple class to start and stop Forwarders running on some ports.
2656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski *
2756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * It uses a singleton pattern and is thread safe.
2856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski */
2956d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowskipublic class ForwarderManager {
3056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    /**
3156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski     * The IP address of the server serving the tests.
3256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski     */
3356d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    private static final String HOST_IP = "127.0.0.1";
3456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
3556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    /**
3656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski     * We use these ports because other webkit platforms do. They are set up in
3756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski     * external/webkit/LayoutTests/http/conf/apache2-debian-httpd.conf
3856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski     */
3956d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public static final int HTTP_PORT = 8080;
4056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public static final int HTTPS_PORT = 8443;
4156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
42c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    public static final String HOST = "localhost";
43c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
4456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    private static ForwarderManager forwarderManager;
4556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
4656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    private Set<Forwarder> mServers;
4756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
4856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    private ForwarderManager() {
4956d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        mServers = new HashSet<Forwarder>(2);
5056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        mServers.add(new Forwarder(HTTP_PORT, HOST_IP));
5156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        mServers.add(new Forwarder(HTTPS_PORT, HOST_IP));
5256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    }
5356d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
54c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    /**
55c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     * Returns the main part of the URL with the trailing slash
56c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     *
57c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     * @param isHttps
58c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     * @return
59c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     */
60c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    public static final String getHostSchemePort(boolean isHttps) {
61c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        int port;
62c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        String protocol;
63c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        if (isHttps) {
64c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            protocol = "https";
65c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            port = HTTPS_PORT;
66c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        } else {
67c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            protocol = "http";
68c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            port = HTTP_PORT;
69c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
70c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
71c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        URL url = null;
72c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        try {
73c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            url = new URL(protocol, HOST, port, "/");
74c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        } catch (MalformedURLException e) {
75c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            assert false : "isHttps=" + isHttps;
76c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
77c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
78c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        return url.toString();
79c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    }
80c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
8156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public static synchronized ForwarderManager getForwarderManager() {
8256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        if (forwarderManager == null) {
8356d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski            forwarderManager = new ForwarderManager();
8456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        }
8556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        return forwarderManager;
8656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    }
8756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
8856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    @Override
8956d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public Object clone() throws CloneNotSupportedException {
9056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        throw new CloneNotSupportedException();
9156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    }
9256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
9356d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public synchronized void start() {
9456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        for (Forwarder server : mServers) {
9556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski            server.start();
9656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        }
9756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    }
9856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
9956d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public synchronized void stop() {
10056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        for (Forwarder server : mServers) {
10156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski            server.finish();
10256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        }
10356d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    }
10456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski}