16316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin/*
26316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin * Copyright (C) 2013 DroidDriver committers
36316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin *
46316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin * Licensed under the Apache License, Version 2.0 (the "License");
56316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin * you may not use this file except in compliance with the License.
66316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin * You may obtain a copy of the License at
76316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin *
86316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin *      http://www.apache.org/licenses/LICENSE-2.0
96316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin *
106316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin * Unless required by applicable law or agreed to in writing, software
116316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin * distributed under the License is distributed on an "AS IS" BASIS,
126316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin * See the License for the specific language governing permissions and
146316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin * limitations under the License.
156316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin */
166316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin
174b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinpackage io.appium.droiddriver.util;
186316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin
19082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jinimport android.annotation.TargetApi;
20082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jinimport android.os.Build;
216316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jinimport android.util.Log;
226316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin
236316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jinimport java.io.BufferedOutputStream;
246316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jinimport java.io.File;
256316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jinimport java.io.FileNotFoundException;
266316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jinimport java.io.FileOutputStream;
276316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin
284b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinimport io.appium.droiddriver.exceptions.DroidDriverException;
294b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jin
306316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin/**
3105cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin * Internal helper methods for manipulating files.
326316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin */
336316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jinpublic class FileUtils {
3405cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin  /**
3505cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin   * Opens file at {@code path} to output. If any directories on {@code path} do
36d2abd0b28789a4a187343b0485e2b8e3fc9ef7acKevin Jin   * not exist, they will be created. The file will be readable and writable to
37d2abd0b28789a4a187343b0485e2b8e3fc9ef7acKevin Jin   * all.
3805cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin   */
39082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin  @TargetApi(Build.VERSION_CODES.GINGERBREAD)
406316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin  public static BufferedOutputStream open(String path) throws FileNotFoundException {
41df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin    File file = getAbsoluteFile(path);
4205cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin
436316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin    Logs.log(Log.INFO, "opening file " + file.getAbsolutePath());
4484761db4f87ea7ec566c3aa0e7ef6f2757643186Kevin Jin    BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(file));
45082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
46082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin      file.setReadable(true /* readable */, false/* ownerOnly */);
47082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin      file.setWritable(true /* readable */, false/* ownerOnly */);
48082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin    }
4984761db4f87ea7ec566c3aa0e7ef6f2757643186Kevin Jin    return stream;
506316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin  }
5105cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin
52df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin  /**
53df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin   * Returns a new file constructed using the absolute path of {@code path}.
54df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin   * Unlike {@link File#getAbsoluteFile()}, default parent is "java.io.tmpdir"
55df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin   * instead of "user.dir".
56df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin   * <p>
57df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin   * If any directories on {@code path} do not exist, they will be created.
58df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin   */
59df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin  public static File getAbsoluteFile(String path) {
60df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin    File file = new File(path);
61df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin    if (!file.isAbsolute()) {
62df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin      file = new File(System.getProperty("java.io.tmpdir"), path);
63df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin    }
64df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin    mkdirs(file.getParentFile());
65df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin    return file;
66df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin  }
67df8ca0b5f5b6975d351a424db3bc1e8de88fe0fcKevin Jin
68082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin  @TargetApi(Build.VERSION_CODES.GINGERBREAD)
6905cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin  private static void mkdirs(File dir) {
7005cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin    if (dir == null || dir.exists()) {
7105cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin      return;
7205cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin    }
7305cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin
7405cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin    mkdirs(dir.getParentFile());
7505cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin    if (!dir.mkdir()) {
7605cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin      throw new DroidDriverException("failed to mkdir " + dir);
7705cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin    }
78082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
79082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin      dir.setReadable(true /* readable */, false/* ownerOnly */);
80082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin      dir.setWritable(true /* readable */, false/* ownerOnly */);
81082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin      dir.setExecutable(true /* executable */, false/* ownerOnly */);
82082c7925e5109092ff31d7021f1f9bb6daabee12Kevin Jin    }
8305cca15c6b38881a5f35ba0d06c0ffc3701b1e29Kevin Jin  }
846316362de61fca700d7d5a455ad5c0ac9717c365Kevin Jin}
85