| Index: chrome/android/java_staging/src/org/chromium/chrome/browser/crash/CrashFileManager.java
|
| diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/crash/CrashFileManager.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/crash/CrashFileManager.java
|
| deleted file mode 100644
|
| index f3f2ff75dd1a957e123c940e83f8ef338c88c821..0000000000000000000000000000000000000000
|
| --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/crash/CrashFileManager.java
|
| +++ /dev/null
|
| @@ -1,202 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -package org.chromium.chrome.browser.crash;
|
| -
|
| -import android.util.Log;
|
| -
|
| -import org.chromium.base.VisibleForTesting;
|
| -
|
| -import java.io.File;
|
| -import java.io.FilenameFilter;
|
| -import java.util.Arrays;
|
| -import java.util.Comparator;
|
| -import java.util.regex.Matcher;
|
| -import java.util.regex.Pattern;
|
| -
|
| -/**
|
| - * Responsible for the Crash Report directory. It routinely scans the directory
|
| - * for new Minidump files and takes appropriate actions by either uploading new
|
| - * crash dumps or deleting old ones.
|
| - */
|
| -public class CrashFileManager {
|
| - private static final String TAG = "CrashFileManager";
|
| -
|
| - @VisibleForTesting
|
| - static final String CRASH_DUMP_DIR = "Crash Reports";
|
| -
|
| - // This should mirror the C++ CrashUploadList::kReporterLogFilename variable.
|
| - @VisibleForTesting
|
| - static final String CRASH_DUMP_LOGFILE = CRASH_DUMP_DIR + "/uploads.log";
|
| -
|
| - private static final Pattern MINIDUMP_PATTERN =
|
| - Pattern.compile("\\.dmp([0-9]*)(.try[0-9])?\\z");
|
| -
|
| - private static final Pattern UPLOADED_MINIDUMP_PATTERN = Pattern.compile("\\.up([0-9]*)\\z");
|
| -
|
| - private static final String UPLOADED_MINIDUMP_SUFFIX = ".up";
|
| -
|
| - private static final String UPLOAD_ATTEMPT_DELIMITER = ".try";
|
| -
|
| - @VisibleForTesting
|
| - protected static final String TMP_SUFFIX = ".tmp";
|
| -
|
| - private static final Pattern TMP_PATTERN = Pattern.compile("\\.tmp\\z");
|
| -
|
| - private static Comparator<File> sFileComparator = new Comparator<File>() {
|
| - @Override
|
| - public int compare(File lhs, File rhs) {
|
| - if (lhs == rhs) {
|
| - return 0;
|
| - } else if (lhs.lastModified() < rhs.lastModified()) {
|
| - return -1;
|
| - } else {
|
| - return 1;
|
| - }
|
| - }
|
| - };
|
| -
|
| - @VisibleForTesting
|
| - static boolean deleteFile(File fileToDelete) {
|
| - boolean isSuccess = fileToDelete.delete();
|
| - if (!isSuccess) {
|
| - Log.w(TAG, "Unable to delete " + fileToDelete.getAbsolutePath());
|
| - }
|
| - return isSuccess;
|
| - }
|
| -
|
| - public static String tryIncrementAttemptNumber(File mFileToUpload) {
|
| - String newName = incrementAttemptNumber(mFileToUpload.getPath());
|
| - return mFileToUpload.renameTo(new File(newName)) ? newName : null;
|
| - }
|
| -
|
| - /**
|
| - * @return The file name to rename to after an addition attempt to upload
|
| - */
|
| - @VisibleForTesting
|
| - public static String incrementAttemptNumber(String filename) {
|
| - int numTried = readAttemptNumber(filename);
|
| - if (numTried > 0) {
|
| - int newCount = numTried + 1;
|
| - return filename.replaceAll(UPLOAD_ATTEMPT_DELIMITER + numTried,
|
| - UPLOAD_ATTEMPT_DELIMITER + newCount);
|
| - } else {
|
| - return filename + UPLOAD_ATTEMPT_DELIMITER + "1";
|
| - }
|
| - }
|
| -
|
| - @VisibleForTesting
|
| - public static int readAttemptNumber(String filename) {
|
| - int tryIndex = filename.lastIndexOf(UPLOAD_ATTEMPT_DELIMITER);
|
| - if (tryIndex >= 0) {
|
| - tryIndex += UPLOAD_ATTEMPT_DELIMITER.length();
|
| - // To avoid out of bound exceptions
|
| - if (tryIndex < filename.length()) {
|
| - // We don't try more than 3 times.
|
| - String numTriesString = filename.substring(
|
| - tryIndex, tryIndex + 1);
|
| - try {
|
| - return Integer.parseInt(numTriesString);
|
| - } catch (NumberFormatException ignored) {
|
| - return 0;
|
| - }
|
| - }
|
| - }
|
| - return 0;
|
| - }
|
| -
|
| - public static boolean tryMarkAsUploaded(File mFileToUpload) {
|
| - return mFileToUpload.renameTo(
|
| - new File(mFileToUpload.getPath().replaceAll(
|
| - "\\.dmp", UPLOADED_MINIDUMP_SUFFIX)));
|
| - }
|
| -
|
| - private final File mCacheDir;
|
| -
|
| - public CrashFileManager(File cacheDir) {
|
| - if (cacheDir == null) {
|
| - throw new NullPointerException("Specified context cannot be null.");
|
| - } else if (!cacheDir.isDirectory()) {
|
| - throw new IllegalArgumentException(cacheDir.getAbsolutePath()
|
| - + " is not a directory.");
|
| - }
|
| - mCacheDir = cacheDir;
|
| - }
|
| -
|
| - public File[] getAllMinidumpFiles() {
|
| - return getMatchingFiles(MINIDUMP_PATTERN);
|
| - }
|
| -
|
| - public File[] getAllMinidumpFilesSorted() {
|
| - File[] minidumps = getAllMinidumpFiles();
|
| - Arrays.sort(minidumps, sFileComparator);
|
| - return minidumps;
|
| - }
|
| -
|
| - public void cleanOutAllNonFreshMinidumpFiles() {
|
| - for (File f : getAllUploadedFiles()) {
|
| - deleteFile(f);
|
| - }
|
| - for (File f : getAllTempFiles()) {
|
| - deleteFile(f);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Deletes all files including unsent crash reports.
|
| - * Note: This method is called from multiple threads, but it is not thread-safe. It will
|
| - * generate warning messages in logs if race condition occurs.
|
| - */
|
| - @VisibleForTesting
|
| - public void cleanAllMiniDumps() {
|
| - cleanOutAllNonFreshMinidumpFiles();
|
| -
|
| - for (File f : getAllMinidumpFiles()) {
|
| - deleteFile(f);
|
| - }
|
| - }
|
| -
|
| - @VisibleForTesting
|
| - File[] getMatchingFiles(final Pattern pattern) {
|
| - // Get dump dir and get all files with specified suffix.. The path
|
| - // constructed here must match chrome_paths.cc (see case
|
| - // chrome::DIR_CRASH_DUMPS).
|
| - File crashDir = getCrashDirectory();
|
| - if (!crashDir.exists()) {
|
| - Log.w(TAG, crashDir.getAbsolutePath() + " does not exist!");
|
| - return new File[] {};
|
| - }
|
| - if (!crashDir.isDirectory()) {
|
| - Log.w(TAG, crashDir.getAbsolutePath() + " is not a directory!");
|
| - return new File[] {};
|
| - }
|
| - File[] minidumps = crashDir.listFiles(new FilenameFilter() {
|
| - @Override
|
| - public boolean accept(File dir, String filename) {
|
| - Matcher match = pattern.matcher(filename);
|
| - int tries = readAttemptNumber(filename);
|
| - return match.find() && tries < MinidumpUploadService.MAX_TRIES_ALLOWED;
|
| - }
|
| - });
|
| - return minidumps;
|
| - }
|
| -
|
| - @VisibleForTesting
|
| - File[] getAllUploadedFiles() {
|
| - return getMatchingFiles(UPLOADED_MINIDUMP_PATTERN);
|
| - }
|
| -
|
| - @VisibleForTesting
|
| - File getCrashDirectory() {
|
| - return new File(mCacheDir, CRASH_DUMP_DIR);
|
| - }
|
| -
|
| - File getCrashUploadLogFile() {
|
| - return new File(mCacheDir, CRASH_DUMP_LOGFILE);
|
| - }
|
| -
|
| - private File[] getAllTempFiles() {
|
| - return getMatchingFiles(TMP_PATTERN);
|
| - }
|
| -}
|
|
|