13c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski/*
23c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * Copyright (C) 2010 The Android Open Source Project
33c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski *
43c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * Licensed under the Apache License, Version 2.0 (the "License");
53c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * you may not use this file except in compliance with the License.
63c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * You may obtain a copy of the License at
73c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski *
83c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski *      http://www.apache.org/licenses/LICENSE-2.0
93c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski *
103c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * Unless required by applicable law or agreed to in writing, software
113c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * distributed under the License is distributed on an "AS IS" BASIS,
123c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * See the License for the specific language governing permissions and
143c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski * limitations under the License.
153c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski */
163c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski
173c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskipackage com.android.dumprendertree2;
183c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski
193c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport android.util.Log;
203c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski
21c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport com.android.dumprendertree2.forwarder.ForwarderManager;
22c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
23ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.HttpEntity;
24ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.HttpResponse;
25ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.HttpStatus;
26ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.client.HttpClient;
27ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.client.ResponseHandler;
28ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.client.methods.HttpGet;
29ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.conn.ClientConnectionManager;
30ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.conn.scheme.PlainSocketFactory;
31ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.conn.scheme.Scheme;
32ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.conn.scheme.SchemeRegistry;
33ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.conn.ssl.SSLSocketFactory;
34ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.impl.client.DefaultHttpClient;
35ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
36ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.params.BasicHttpParams;
37ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.params.HttpConnectionParams;
38ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.params.HttpParams;
39ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport org.apache.http.util.EntityUtils;
40ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski
41c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.io.BufferedReader;
422aafca6408835307779e7f7dadb28929b11f11d5Guang Zhuimport java.io.BufferedWriter;
433c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport java.io.File;
444ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowskiimport java.io.FileInputStream;
453c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport java.io.FileOutputStream;
462aafca6408835307779e7f7dadb28929b11f11d5Guang Zhuimport java.io.FileReader;
472aafca6408835307779e7f7dadb28929b11f11d5Guang Zhuimport java.io.FileWriter;
483c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport java.io.IOException;
49c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.io.InputStream;
50c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.io.InputStreamReader;
513c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskiimport java.io.OutputStream;
52c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.net.MalformedURLException;
53ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowskiimport java.net.SocketTimeoutException;
54c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.net.URL;
552aafca6408835307779e7f7dadb28929b11f11d5Guang Zhuimport java.util.ArrayList;
56c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.util.LinkedList;
57c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowskiimport java.util.List;
583c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski
593c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski/**
603c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski *
613c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski */
623c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowskipublic class FsUtils {
633c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski    public static final String LOG_TAG = "FsUtils";
643c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski
65c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    private static final String SCRIPT_URL = ForwarderManager.getHostSchemePort(false) +
66183c3c9ca20f55703f31e3610bca72682f6355dbSteve Block            "Tools/DumpRenderTree/android/get_layout_tests_dir_contents.php";
67c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
68ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski    private static final int HTTP_TIMEOUT_MS = 5000;
69ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski
70ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski    private static HttpClient sHttpClient;
71ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski
72ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski    private static HttpClient getHttpClient() {
73ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski        if (sHttpClient == null) {
74ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            HttpParams params = new BasicHttpParams();
75ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski
76ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            SchemeRegistry schemeRegistry = new SchemeRegistry();
77ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(),
78ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                    ForwarderManager.HTTP_PORT));
79ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(),
80ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                    ForwarderManager.HTTPS_PORT));
81ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski
82ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params,
83ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                    schemeRegistry);
84ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            sHttpClient = new DefaultHttpClient(connectionManager, params);
85ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            HttpConnectionParams.setSoTimeout(sHttpClient.getParams(), HTTP_TIMEOUT_MS);
86ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            HttpConnectionParams.setConnectionTimeout(sHttpClient.getParams(), HTTP_TIMEOUT_MS);
87ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski        }
88ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski        return sHttpClient;
89ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski    }
90ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski
913c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski    public static void writeDataToStorage(File file, byte[] bytes, boolean append) {
922e5982a55ac031110ed39515a76f7a5ec9ff2c14Maksymilian Osowski        Log.d(LOG_TAG, "writeDataToStorage(): " + file.getAbsolutePath());
933c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski        try {
943c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski            OutputStream outputStream = null;
953c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski            try {
963c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski                file.getParentFile().mkdirs();
973c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski                file.createNewFile();
98c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                Log.d(LOG_TAG, "writeDataToStorage(): File created: " + file.getAbsolutePath());
993c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski                outputStream = new FileOutputStream(file, append);
1003c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski                outputStream.write(bytes);
1013c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski            } finally {
1023c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski                if (outputStream != null) {
1033c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski                    outputStream.close();
1043c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski                }
1053c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski            }
1063c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski        } catch (IOException e) {
107c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            Log.e(LOG_TAG, "file.getAbsolutePath=" + file.getAbsolutePath() + " append=" + append,
108c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    e);
1093c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski        }
1103c8ccb384513dd9bae0f98ac516ea36fbaa3173bMaksymilian Osowski    }
1114ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski
1124ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski    public static byte[] readDataFromStorage(File file) {
1134ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski        if (!file.exists()) {
1142e5982a55ac031110ed39515a76f7a5ec9ff2c14Maksymilian Osowski            Log.d(LOG_TAG, "readDataFromStorage(): File does not exist: "
1154ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski                    + file.getAbsolutePath());
1164ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski            return null;
1174ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski        }
1184ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski
1194ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski        byte[] bytes = null;
1204ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski        try {
1214ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski            FileInputStream fis = null;
1224ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski            try {
1234ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski                fis = new FileInputStream(file);
124c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                bytes = new byte[(int)file.length()];
1254ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski                fis.read(bytes);
1264ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski            } finally {
1274ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski                if (fis != null) {
1284ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski                    fis.close();
1294ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski                }
1304ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski            }
1314ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski        } catch (IOException e) {
1322e5982a55ac031110ed39515a76f7a5ec9ff2c14Maksymilian Osowski            Log.e(LOG_TAG, "file.getAbsolutePath=" + file.getAbsolutePath(), e);
1334ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski        }
1344ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski
1354ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski        return bytes;
1364ee7f4b19489f4dc9b87e90d1e5c7742cfa7ebe0Maksymilian Osowski    }
137c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
138cda9448206494b67c0812b9591cc066ca070a7a6Steve Block    static class UrlDataGetter extends Thread {
139cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        private URL mUrl;
140cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        private byte[] mBytes;
141cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        private boolean mGetComplete;
142cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        public UrlDataGetter(URL url) {
143cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            mUrl = url;
144c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
145cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        public byte[] get() {
146cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            start();
147cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            synchronized(this) {
148cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                while (!mGetComplete) {
149cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    try{
150cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                        wait();
151cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    } catch(InterruptedException e) {
152cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    }
153c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                }
154ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            }
155cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            return mBytes;
156cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        }
157cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        public synchronized void run() {
158cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            mGetComplete = false;
159cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            HttpGet httpRequest = new HttpGet(mUrl.toString());
160cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            ResponseHandler<byte[]> handler = new ResponseHandler<byte[]>() {
161cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                @Override
162cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                public byte[] handleResponse(HttpResponse response) throws IOException {
163cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
164cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                        return null;
165cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    }
166cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    HttpEntity entity = response.getEntity();
167cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    return (entity == null ? null : EntityUtils.toByteArray(entity));
168c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                }
169cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            };
170cda9448206494b67c0812b9591cc066ca070a7a6Steve Block
171cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            mBytes = null;
172cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            try {
173cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                /**
174cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                 * TODO: Not exactly sure why some requests hang indefinitely, but adding this
175cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                 * timeout (in static getter for http client) in loop helps.
176cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                 */
177cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                boolean timedOut;
178cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                do {
179cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    timedOut = false;
180cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    try {
181cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                        mBytes = getHttpClient().execute(httpRequest, handler);
182cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    } catch (SocketTimeoutException e) {
183cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                        timedOut = true;
184cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                        Log.w(LOG_TAG, "Expected SocketTimeoutException: " + mUrl, e);
185cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                    }
186cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                } while (timedOut);
187cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            } catch (IOException e) {
188cda9448206494b67c0812b9591cc066ca070a7a6Steve Block                Log.e(LOG_TAG, "url=" + mUrl, e);
189cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            }
190cda9448206494b67c0812b9591cc066ca070a7a6Steve Block
191cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            mGetComplete = true;
192cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            notify();
193c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
194cda9448206494b67c0812b9591cc066ca070a7a6Steve Block    }
195c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
196cda9448206494b67c0812b9591cc066ca070a7a6Steve Block    public static byte[] readDataFromUrl(URL url) {
197cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        if (url == null) {
198cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            Log.w(LOG_TAG, "readDataFromUrl(): url is null!");
199cda9448206494b67c0812b9591cc066ca070a7a6Steve Block            return null;
200cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        }
201cda9448206494b67c0812b9591cc066ca070a7a6Steve Block
202cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        UrlDataGetter getter = new UrlDataGetter(url);
203cda9448206494b67c0812b9591cc066ca070a7a6Steve Block        return getter.get();
204c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    }
205c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
206c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    public static List<String> getLayoutTestsDirContents(String dirRelativePath, boolean recurse,
207c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            boolean mode) {
208c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        String modeString = (mode ? "folders" : "files");
209c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
210c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        URL url = null;
211c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        try {
212c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            url = new URL(SCRIPT_URL +
213c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    "?path=" + dirRelativePath +
214c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    "&recurse=" + recurse +
215c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    "&mode=" + modeString);
216c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        } catch (MalformedURLException e) {
217c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            Log.e(LOG_TAG, "path=" + dirRelativePath + " recurse=" + recurse + " mode=" +
218c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                    modeString, e);
219ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            return new LinkedList<String>();
220c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
221c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
222ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski        HttpGet httpRequest = new HttpGet(url.toString());
223ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski        ResponseHandler<LinkedList<String>> handler = new ResponseHandler<LinkedList<String>>() {
224ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            @Override
225ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            public LinkedList<String> handleResponse(HttpResponse response)
226ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                    throws IOException {
227ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                LinkedList<String> lines = new LinkedList<String>();
228c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski
229ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
230ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                    return lines;
231c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                }
232ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                HttpEntity entity = response.getEntity();
233ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                if (entity == null) {
234ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                    return lines;
235c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                }
236ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski
237ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                BufferedReader reader =
238ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                        new BufferedReader(new InputStreamReader(entity.getContent()));
239ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                String line;
240ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                try {
241ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                    while ((line = reader.readLine()) != null) {
242ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                        lines.add(line);
243ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                    }
244ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                } finally {
245ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                    if (reader != null) {
246ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                        reader.close();
247ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                    }
248c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski                }
249ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski
250ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski                return lines;
251c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski            }
252ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski        };
253ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski
254ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski        try {
255ce2ef18c8f220df13c3fca031f440dfc98362242Maksymilian Osowski            return getHttpClient().execute(httpRequest, handler);
256c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        } catch (IOException e) {
257cb98a3e621b7c56d1367a1bf77cd91dae3feb6daSteve Block            Log.e(LOG_TAG, "getLayoutTestsDirContents(): HTTP GET failed for URL " + url);
258cb98a3e621b7c56d1367a1bf77cd91dae3feb6daSteve Block            return null;
259c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski        }
260c6a341d34c690c2b5948977cd803ec2ff668c4b7Maksymilian Osowski    }
2615af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski
2625af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski    public static void closeInputStream(InputStream inputStream) {
2635af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski        try {
2645af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski            if (inputStream != null) {
2655af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski                inputStream.close();
2665af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski            }
2675af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski        } catch (IOException e) {
2685af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski            Log.e(LOG_TAG, "Couldn't close stream!", e);
2695af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski        }
2705af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski    }
2715af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski
2725af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski    public static void closeOutputStream(OutputStream outputStream) {
2735af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski        try {
2745af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski            if (outputStream != null) {
2755af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski                outputStream.close();
2765af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski            }
2775af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski        } catch (IOException e) {
2785af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski            Log.e(LOG_TAG, "Couldn't close stream!", e);
2795af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski        }
2805af84db492a0c198377ba4dacc83c5a211e96ff6Maksymilian Osowski    }
2812aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu
2822aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu    public static List<String> loadTestListFromStorage(String path) {
2832aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu        List<String> list = new ArrayList<String>();
2842aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu        if (path != null && !path.isEmpty()) {
2852aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu            try {
2862aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                File file = new File(path);
2872aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                Log.d(LOG_TAG, "test list loaded from " + path);
2882aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                BufferedReader reader = new BufferedReader(new FileReader(file));
2892aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                String line = null;
2902aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                while ((line = reader.readLine()) != null) {
2912aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                    list.add(line);
2922aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                }
2932aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                reader.close();
2942aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu            } catch (IOException ioe) {
2952aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                Log.e(LOG_TAG, "failed to load test list", ioe);
2962aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu            }
2972aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu        }
2982aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu        return list;
2992aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu    }
3002aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu
3012aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu    public static void saveTestListToStorage(File file, int start, List<String> testList) {
3022aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu        try {
3032aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu            BufferedWriter writer = new BufferedWriter(
3042aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                    new FileWriter(file));
3052aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu            for (String line : testList.subList(start, testList.size())) {
3062aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu                writer.write(line + '\n');
3072aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu            }
3082aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu            writer.flush();
3092aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu            writer.close();
3102aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu        } catch (IOException e) {
3112aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu            Log.e(LOG_TAG, "failed to write test list", e);
3122aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu        }
3132aafca6408835307779e7f7dadb28929b11f11d5Guang Zhu    }
314cb98a3e621b7c56d1367a1bf77cd91dae3feb6daSteve Block}
315