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;
21ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowskiimport android.util.Log;
22ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski
2356d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowskiimport java.util.HashSet;
2456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowskiimport java.util.Set;
2556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
2656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski/**
2756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * A simple class to start and stop Forwarders running on some ports.
2856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski *
2956d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski * It uses a singleton pattern and is thread safe.
3056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski */
3156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowskipublic class ForwarderManager {
32ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski    private static final String LOG_TAG = "ForwarderManager";
33ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski
3456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    /**
3556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski     * The IP address of the server serving the tests.
3656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski     */
3756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    private static final String HOST_IP = "127.0.0.1";
3856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
3956d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    /**
4056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski     * We use these ports because other webkit platforms do. They are set up in
4156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski     * external/webkit/LayoutTests/http/conf/apache2-debian-httpd.conf
4256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski     */
4376c97ee414dfc752ce26201a440bf7c451acae85Steve Block    public static final int HTTP_PORT = 8000;
4456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public static final int HTTPS_PORT = 8443;
4556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
4656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    private static ForwarderManager forwarderManager;
4756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
48ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski    private Set<Forwarder> mForwarders;
49ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski    private boolean mIsStarted;
5056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
5156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    private ForwarderManager() {
52ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        mForwarders = new HashSet<Forwarder>(2);
53ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        mForwarders.add(new Forwarder(HTTP_PORT, HOST_IP));
54ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        mForwarders.add(new Forwarder(HTTPS_PORT, HOST_IP));
5556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    }
5656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
57c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    /**
58c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     * Returns the main part of the URL with the trailing slash
59c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     *
60c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     * @param isHttps
61c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     * @return
62c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski     */
63c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    public static final String getHostSchemePort(boolean isHttps) {
64c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        int port;
65c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        String protocol;
66c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        if (isHttps) {
67c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            protocol = "https";
68c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            port = HTTPS_PORT;
69c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        } else {
70c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            protocol = "http";
71c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            port = HTTP_PORT;
72c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
73c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
74c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        URL url = null;
75c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        try {
7676c97ee414dfc752ce26201a440bf7c451acae85Steve Block            url = new URL(protocol, HOST_IP, port, "/");
77c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        } catch (MalformedURLException e) {
78c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            assert false : "isHttps=" + isHttps;
79c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
80c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
81c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        return url.toString();
82c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    }
83c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
8456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public static synchronized ForwarderManager getForwarderManager() {
8556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        if (forwarderManager == null) {
8656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski            forwarderManager = new ForwarderManager();
8756d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        }
8856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        return forwarderManager;
8956d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    }
9056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
9156d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    @Override
9256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public Object clone() throws CloneNotSupportedException {
9356d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        throw new CloneNotSupportedException();
9456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    }
9556d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
9656d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public synchronized void start() {
97ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        if (mIsStarted) {
98ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski            Log.w(LOG_TAG, "start(): ForwarderManager already running! NOOP.");
99ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski            return;
100ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        }
101ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski
102ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        for (Forwarder forwarder : mForwarders) {
103ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski            forwarder.start();
10456d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        }
105ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski
106ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        mIsStarted = true;
107ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        Log.i(LOG_TAG, "ForwarderManager started.");
10856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    }
10956d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski
11056d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    public synchronized void stop() {
111ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        if (!mIsStarted) {
112ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski            Log.w(LOG_TAG, "stop(): ForwarderManager already stopped! NOOP.");
113ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski            return;
114ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        }
115ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski
116ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        for (Forwarder forwarder : mForwarders) {
117ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski            forwarder.finish();
11856d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski        }
119ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski
120ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        mIsStarted = false;
121ef9a2175ee29b9a9c84ddd0a02d1ec80ab095222Maksymilian Osowski        Log.i(LOG_TAG, "ForwarderManager stopped.");
12256d7e400ece64591685c8a21dbb82a94a7bd8010Maksymilian Osowski    }
12376c97ee414dfc752ce26201a440bf7c451acae85Steve Block}
124