Skip to content

Commit

Permalink
Merge pull request facebookarchive#91 from jferlisi/database_file_pro…
Browse files Browse the repository at this point in the history
…vider

Added a way to provide the database files to the DatabasePeerManager module.
  • Loading branch information
jasta committed Mar 13, 2015
2 parents 7a2d418 + bca224c commit 32f6c63
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 29 deletions.
3 changes: 2 additions & 1 deletion stetho/src/main/java/com/facebook/stetho/Stetho.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.facebook.stetho;

import com.facebook.stetho.inspector.database.DefaultDatabaseFilesProvider;
import javax.annotation.Nullable;

import java.io.IOException;
Expand Down Expand Up @@ -115,7 +116,7 @@ public Iterable<ChromeDevtoolsDomain> get() {
modules.add(new Runtime());
modules.add(new Worker());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
modules.add(new Database(context));
modules.add(new Database(context, new DefaultDatabaseFilesProvider(context)));
}
return modules;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.facebook.stetho.inspector.database;

import java.io.File;
import java.util.List;

/**
* Provides a {@link List} of database files.
*/
public interface DatabaseFilesProvider {

/**
* Returns a {@link List} of database files.
*/
List<File> getDatabaseFiles();

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

package com.facebook.stetho.inspector.database;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.concurrent.ThreadSafe;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import android.content.Context;
import android.database.Cursor;
Expand All @@ -30,18 +30,39 @@ public class DatabasePeerManager extends ChromePeerManager {
};

private final Context mContext;
private final DatabaseFilesProvider mDatabaseFilesProvider;

/**
* Constructs the object with a {@link DatabaseFilesProvider} that supplies the database files
* from {@link Context#databaseList()}.
*
* @param context the context
* @deprecated use the other {@linkplain DatabasePeerManager#DatabasePeerManager(Context,
* DatabaseFilesProvider) constructor} and pass in the {@linkplain DefaultDatabaseFilesProvider
* default provider}.
*/
@Deprecated
public DatabasePeerManager(Context context) {
this(context, new DefaultDatabaseFilesProvider(context));
}

/**
* @param context the context
* @param databaseFilesProvider a database file name provider
*/
public DatabasePeerManager(Context context, DatabaseFilesProvider databaseFilesProvider) {
mContext = context;
mDatabaseFilesProvider = databaseFilesProvider;
setListener(mPeerRegistrationListener);
}

private void bootstrapNewPeer(JsonRpcPeer peer) {
Iterable<String> tidiedList = tidyDatabaseList(mContext.databaseList());
for (String databaseName : tidiedList) {
List<File> potentialDatabaseFiles = mDatabaseFilesProvider.getDatabaseFiles();
Iterable<File> tidiedList = tidyDatabaseList(potentialDatabaseFiles);
for (File database : tidiedList) {
Database.DatabaseObject databaseParams = new Database.DatabaseObject();
databaseParams.id = databaseName;
databaseParams.name = databaseName;
databaseParams.id = database.getPath();
databaseParams.name = database.getName();
databaseParams.domain = mContext.getPackageName();
databaseParams.version = "N/A";
Database.AddDatabaseEvent eventParams = new Database.AddDatabaseEvent();
Expand All @@ -56,17 +77,18 @@ private void bootstrapNewPeer(JsonRpcPeer peer) {
* that this only removes the database if it is true that it shadows another database lacking
* the uninteresting suffix.
*
* @param databaseFilenames Raw list of database filenames.
* @param databaseFiles Raw list of database files.
* @return Tidied list with shadow databases removed.
*/
// @VisibleForTesting
static List<String> tidyDatabaseList(String[] databaseFilenames) {
Set<String> originalAsSet = new HashSet<String>(Arrays.asList(databaseFilenames));
List<String> tidiedList = new ArrayList<String>();
for (String databaseFilename : databaseFilenames) {
static List<File> tidyDatabaseList(List<File> databaseFiles) {
Set<File> originalAsSet = new HashSet<File>(databaseFiles);
List<File> tidiedList = new ArrayList<File>();
for (File databaseFile : databaseFiles) {
String databaseFilename = databaseFile.getPath();
String sansSuffix = removeSuffix(databaseFilename, UNINTERESTING_FILENAME_SUFFIXES);
if (sansSuffix.equals(databaseFilename) || !originalAsSet.contains(sansSuffix)) {
tidiedList.add(databaseFilename);
if (sansSuffix.equals(databaseFilename) || !originalAsSet.contains(new File(sansSuffix))) {
tidiedList.add(databaseFile);
}
}
return tidiedList;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.facebook.stetho.inspector.database;

import android.content.Context;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
* Provides the results of {@link Context#databaseList()}.
*/
public final class DefaultDatabaseFilesProvider implements DatabaseFilesProvider {

private final Context mContext;

public DefaultDatabaseFilesProvider(Context context) {
mContext = context;
}

@Override
public List<File> getDatabaseFiles() {
List<File> databaseFiles = new ArrayList<File>();
for (String filename : mContext.databaseList()) {
databaseFiles.add(new File(filename));
}
return databaseFiles;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

package com.facebook.stetho.inspector.protocol.module;

import com.facebook.stetho.inspector.database.DatabaseFilesProvider;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Expand Down Expand Up @@ -38,11 +39,25 @@ public class Database implements ChromeDevtoolsDomain {
private final DatabasePeerManager mDatabasePeerManager;
private final ObjectMapper mObjectMapper;

/**
* Constructs the object with the default {@link DatabasePeerManager}.
* @param context the context
*/
@Deprecated
public Database(Context context) {
mDatabasePeerManager = new DatabasePeerManager(context);
mObjectMapper = new ObjectMapper();
}

/**
* @param context the context
* @param databaseFilesProvider a database files provider
*/
public Database(Context context, DatabaseFilesProvider databaseFilesProvider) {
mDatabasePeerManager = new DatabasePeerManager(context, databaseFilesProvider);
mObjectMapper = new ObjectMapper();
}

@ChromeDevtoolsMethod
public void enable(JsonRpcPeer peer, JSONObject params) {
mDatabasePeerManager.addPeer(peer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

package com.facebook.stetho.inspector.database;

import java.io.File;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;
Expand All @@ -11,19 +13,19 @@
public class DatabasePeerManagerTest {
@Test
public void testTidyDatabaseList() {
String[] databases = {
"foo.db", "foo.db-journal",
"bar.db", "bar.db-journal", "bar.db-uid",
"baz.db", "baz.db-somethingelse",
"dangling.db-journal",
};
String[] expected = {
"foo.db",
"bar.db",
"baz.db", "baz.db-somethingelse",
"dangling.db-journal",
};
List<String> tidied = DatabasePeerManager.tidyDatabaseList(databases);
assertArrayEquals(expected, tidied.toArray());
File[] databases = {
new File("foo.db"), new File("foo.db-journal"),
new File("bar.db"), new File("bar.db-journal"), new File( "bar.db-uid"),
new File("baz.db"), new File("baz.db-somethingelse"),
new File("dangling.db-journal"),
};
File[] expected = {
new File( "foo.db"),
new File("bar.db"),
new File("baz.db"), new File("baz.db-somethingelse"),
new File("dangling.db-journal")
};
List<File> tidied = DatabasePeerManager.tidyDatabaseList(Arrays.asList(databases));
assertArrayEquals(expected, tidied.toArray());
}
}

0 comments on commit 32f6c63

Please sign in to comment.