1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.dumprendertree2.forwarder;
18
19import java.net.MalformedURLException;
20import java.net.URL;
21import android.util.Log;
22
23import java.util.HashSet;
24import java.util.Set;
25
26/**
27 * A simple class to start and stop Forwarders running on some ports.
28 *
29 * It uses a singleton pattern and is thread safe.
30 */
31public class ForwarderManager {
32    private static final String LOG_TAG = "ForwarderManager";
33
34    /**
35     * The IP address of the server serving the tests.
36     */
37    private static final String HOST_IP = "127.0.0.1";
38
39    /**
40     * We use these ports because other webkit platforms do. They are set up in
41     * external/webkit/LayoutTests/http/conf/apache2-debian-httpd.conf
42     */
43    public static final int HTTP_PORT = 8000;
44    public static final int HTTPS_PORT = 8443;
45
46    private static ForwarderManager forwarderManager;
47
48    private Set<Forwarder> mForwarders;
49    private boolean mIsStarted;
50
51    private ForwarderManager() {
52        mForwarders = new HashSet<Forwarder>(2);
53        mForwarders.add(new Forwarder(HTTP_PORT, HOST_IP));
54        mForwarders.add(new Forwarder(HTTPS_PORT, HOST_IP));
55    }
56
57    /**
58     * Returns the main part of the URL with the trailing slash
59     *
60     * @param isHttps
61     * @return
62     */
63    public static final String getHostSchemePort(boolean isHttps) {
64        int port;
65        String protocol;
66        if (isHttps) {
67            protocol = "https";
68            port = HTTPS_PORT;
69        } else {
70            protocol = "http";
71            port = HTTP_PORT;
72        }
73
74        URL url = null;
75        try {
76            url = new URL(protocol, HOST_IP, port, "/");
77        } catch (MalformedURLException e) {
78            assert false : "isHttps=" + isHttps;
79        }
80
81        return url.toString();
82    }
83
84    public static synchronized ForwarderManager getForwarderManager() {
85        if (forwarderManager == null) {
86            forwarderManager = new ForwarderManager();
87        }
88        return forwarderManager;
89    }
90
91    @Override
92    public Object clone() throws CloneNotSupportedException {
93        throw new CloneNotSupportedException();
94    }
95
96    public synchronized void start() {
97        if (mIsStarted) {
98            Log.w(LOG_TAG, "start(): ForwarderManager already running! NOOP.");
99            return;
100        }
101
102        for (Forwarder forwarder : mForwarders) {
103            forwarder.start();
104        }
105
106        mIsStarted = true;
107        Log.i(LOG_TAG, "ForwarderManager started.");
108    }
109
110    public synchronized void stop() {
111        if (!mIsStarted) {
112            Log.w(LOG_TAG, "stop(): ForwarderManager already stopped! NOOP.");
113            return;
114        }
115
116        for (Forwarder forwarder : mForwarders) {
117            forwarder.finish();
118        }
119
120        mIsStarted = false;
121        Log.i(LOG_TAG, "ForwarderManager stopped.");
122    }
123}
124