From fa3a5fa6bbffa0e53e7714382f47023962d396be Mon Sep 17 00:00:00 2001 From: wangmengyan95 Date: Wed, 2 Sep 2015 16:46:22 -0700 Subject: [PATCH 1/2] Split ParseNetworkInterceptor Module --- ParseNetworkLogger/build.gradle | 89 +++++++++++++++++++ .../src/main/AndroidManifest.xml | 12 +++ .../java/com/parse/ParseLogInterceptor.java | 2 +- .../com/parse/ParseStethoInterceptor.java | 2 +- .../com/parse/ParseLogInterceptorTest.java | 6 -- settings.gradle | 2 +- 6 files changed, 104 insertions(+), 9 deletions(-) create mode 100644 ParseNetworkLogger/build.gradle create mode 100644 ParseNetworkLogger/src/main/AndroidManifest.xml rename {Parse => ParseNetworkLogger}/src/main/java/com/parse/ParseLogInterceptor.java (99%) rename {Parse => ParseNetworkLogger}/src/main/java/com/parse/ParseStethoInterceptor.java (99%) rename {Parse => ParseNetworkLogger}/src/test/java/com/parse/ParseLogInterceptorTest.java (95%) diff --git a/ParseNetworkLogger/build.gradle b/ParseNetworkLogger/build.gradle new file mode 100644 index 000000000..2cf2dcc6d --- /dev/null +++ b/ParseNetworkLogger/build.gradle @@ -0,0 +1,89 @@ +apply plugin: 'com.android.library' + +group = 'com.parse' +version = VERSION_NAME + +buildscript { + repositories { + mavenCentral() + } +} + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + buildToolsVersion rootProject.ext.buildToolsVersion + + defaultConfig { + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName VERSION_NAME + } + + lintOptions { + abortOnError false + } + + buildTypes { + debug { + testCoverageEnabled = true + } + } +} + +dependencies { + compile project(':Parse') + + provided 'com.facebook.stetho:stetho:1.1.1' + + testCompile 'junit:junit:4.12' + testCompile "org.json:json:20140107" +} + +android.libraryVariants.all { variant -> + def name = variant.buildType.name + def jar = project.tasks.create(name: "jar${name.capitalize()}", type: Jar) { + dependsOn variant.javaCompile + from variant.javaCompile.destinationDir + + manifest { + attributes( + "Bundle-Name": 'parse-network-logger', + "Bundle-Version": project.version + ) + } + + exclude '**/R.class' + exclude '**/R\$*.class' + exclude '**/Manifest.class' + exclude '**/Manifest\$*.class' + exclude '**/BuildConfig.class' + } + + def javadoc = task("javadoc${variant.name.capitalize()}", type: Javadoc) { + description "Generates Javadoc for $variant.name." + source = variant.javaCompile.source + ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar" + classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar) + + options.docletpath = [rootProject.file("./gradle/ExcludeDoclet.jar")] + options.doclet = "me.grantland.doclet.ExcludeDoclet" + + options.linksOffline("http://d.android.com/reference", "${android.sdkDirectory}/docs/reference") + options.links("http://boltsframework.github.io/docs/android/") + + exclude '**/BuildConfig.java' + exclude '**/R.java' + exclude '**/internal/**' + } + + def javadocJar = task("javadocJar${variant.name.capitalize()}", type: Jar, dependsOn: "javadoc${variant.name.capitalize()}") { + classifier = 'javadoc' + from javadoc.destinationDir + } + + if (name.equals(com.android.builder.core.BuilderConstants.RELEASE)) { + artifacts.add('archives', jar); + artifacts.add('archives', javadocJar); + } +} diff --git a/ParseNetworkLogger/src/main/AndroidManifest.xml b/ParseNetworkLogger/src/main/AndroidManifest.xml new file mode 100644 index 000000000..d477b9688 --- /dev/null +++ b/ParseNetworkLogger/src/main/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/Parse/src/main/java/com/parse/ParseLogInterceptor.java b/ParseNetworkLogger/src/main/java/com/parse/ParseLogInterceptor.java similarity index 99% rename from Parse/src/main/java/com/parse/ParseLogInterceptor.java rename to ParseNetworkLogger/src/main/java/com/parse/ParseLogInterceptor.java index ad729e4cb..5ecdc1fb2 100644 --- a/Parse/src/main/java/com/parse/ParseLogInterceptor.java +++ b/ParseNetworkLogger/src/main/java/com/parse/ParseLogInterceptor.java @@ -31,7 +31,7 @@ * {@code ParseLogInterceptor} is used to log the request and response information to the given * logger. */ -/** package */ class ParseLogInterceptor implements ParseNetworkInterceptor { +public class ParseLogInterceptor implements ParseNetworkInterceptor { private final static String TAG = "ParseLogNetworkInterceptor"; private final static String LOG_PARAGRAPH_BREAKER = "--------------"; diff --git a/Parse/src/main/java/com/parse/ParseStethoInterceptor.java b/ParseNetworkLogger/src/main/java/com/parse/ParseStethoInterceptor.java similarity index 99% rename from Parse/src/main/java/com/parse/ParseStethoInterceptor.java rename to ParseNetworkLogger/src/main/java/com/parse/ParseStethoInterceptor.java index 8f3bc08ee..cc0c24155 100644 --- a/Parse/src/main/java/com/parse/ParseStethoInterceptor.java +++ b/ParseNetworkLogger/src/main/java/com/parse/ParseStethoInterceptor.java @@ -26,7 +26,7 @@ * {@code ParseStethoInterceptor} is used to log the request and response through Stetho to chrome * browser debugger. */ -/** package */ class ParseStethoInterceptor implements ParseNetworkInterceptor { +public class ParseStethoInterceptor implements ParseNetworkInterceptor { private static final String CONTENT_LENGTH_HEADER = "Content-Length"; private static final String CONTENT_TYPE_HEADER = "Content-Type"; diff --git a/Parse/src/test/java/com/parse/ParseLogInterceptorTest.java b/ParseNetworkLogger/src/test/java/com/parse/ParseLogInterceptorTest.java similarity index 95% rename from Parse/src/test/java/com/parse/ParseLogInterceptorTest.java rename to ParseNetworkLogger/src/test/java/com/parse/ParseLogInterceptorTest.java index 0b117d630..8495ab60b 100644 --- a/Parse/src/test/java/com/parse/ParseLogInterceptorTest.java +++ b/ParseNetworkLogger/src/test/java/com/parse/ParseLogInterceptorTest.java @@ -11,9 +11,6 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.annotation.Config; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -26,9 +23,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -// For GZIPOutputStream -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = BuildConfig.class, sdk = 21) public class ParseLogInterceptorTest { @Rule diff --git a/settings.gradle b/settings.gradle index 520075f69..cbafa6344 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,3 @@ include ':Parse' include ':ParseStarterProject' - +include ':ParseNetworkLogger' From 915230d880a5628b05f3a84a37eb12c585f28125 Mon Sep 17 00:00:00 2001 From: wangmengyan95 Date: Wed, 9 Sep 2015 15:00:24 -0700 Subject: [PATCH 2/2] Add additional comment --- .../com/parse/ParseNetworkInterceptor.java | 10 +++- .../java/com/parse/ParseLogInterceptor.java | 55 ++++++++++++++++++- .../com/parse/ParseStethoInterceptor.java | 8 +++ 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/Parse/src/main/java/com/parse/ParseNetworkInterceptor.java b/Parse/src/main/java/com/parse/ParseNetworkInterceptor.java index 0491b7272..4df47d024 100644 --- a/Parse/src/main/java/com/parse/ParseNetworkInterceptor.java +++ b/Parse/src/main/java/com/parse/ParseNetworkInterceptor.java @@ -17,10 +17,14 @@ /** package */ interface ParseNetworkInterceptor { /** + * Intercept the {@link ParseHttpRequest} with the help of + * {@link com.parse.ParseNetworkInterceptor.Chain}, proceed the {@link ParseHttpRequest} and get + * the {@link ParseHttpResponse}, intercept the {@link ParseHttpResponse} and return the + * intercepted {@link ParseHttpResponse}. * @param chain - * The helper chain we used to get the request, proceed the request and receive the - * response. - * @return The intercepted response. + * The helper chain we used to get the {@link ParseHttpRequest}, proceed the + * {@link ParseHttpRequest} and receive the {@link ParseHttpResponse}. + * @return The intercepted {@link ParseHttpResponse}. * @throws IOException */ ParseHttpResponse intercept(Chain chain) throws IOException; diff --git a/ParseNetworkLogger/src/main/java/com/parse/ParseLogInterceptor.java b/ParseNetworkLogger/src/main/java/com/parse/ParseLogInterceptor.java index 5ecdc1fb2..73a89270d 100644 --- a/ParseNetworkLogger/src/main/java/com/parse/ParseLogInterceptor.java +++ b/ParseNetworkLogger/src/main/java/com/parse/ParseLogInterceptor.java @@ -58,7 +58,7 @@ public class ParseLogInterceptor implements ParseNetworkInterceptor { * The {@code Logger} to log the request and response information. */ public static abstract class Logger { - public static String NEW_LINE = "\n"; + private static String NEW_LINE = System.getProperty("line.separator"); // The reason we need a lock here is since multiple network threads may write to the // logger concurrently, the message of different threads may intertwined. We need this @@ -69,25 +69,58 @@ public Logger() { lock = new ReentrantLock(); } + /** + * Write the given string through {@code Logger}. + * @param str + * The string to be written. + */ public abstract void write(String str); + /** + * Lock the {@code Logger}. Since multiple threads may use a same {@code Logger}, we need to + * to lock the {@code Logger} to make sure content written by different threads does not + * intertwined. + */ public void lock() { lock.lock(); } + /** + * Unlock the {@code Logger}. + */ public void unlock() { lock.unlock(); } + /** + * Write a key-value pair through {@code Logger}. The name and value are separated by :. + * @param name + * The key of the key-value pair to be written. + * @param value + * The value of the key-value pair to be written. + */ public void write(String name, String value) { write(name + " : " + value); } + /** + * Write the given string followed by a newline through {@code Logger}. + * @param str + * The string to be written. + */ public void writeLine(String str) { write(str); write(NEW_LINE); } + /** + * Write a key-value pair followed by a newline through {@code Logger}. The name and value are + * separated by :. + * @param name + * The key of the key-value pair to be written. + * @param value + * The value of the key-value pair to be written. + */ public void writeLine(String name, String value) { writeLine(name + " : " + value); } @@ -100,6 +133,11 @@ private static class LogcatLogger extends Logger { private static int MAX_MESSAGE_LENGTH = 4000; + /** + * Write the given string to Android logcat. + * @param str + * The string to be written. + */ @Override public void write(String str) { // Logcat can only print the limited number of characters in one line, so when we have a long @@ -112,6 +150,13 @@ public void write(String str) { } } + /** + * Write the given string to Android logcat followed by a newline. Since Android {@link Log} + * actually adds newline for each write, we need to override this method to avoid adding + * additional newlines. + * @param str + * The string to be written. + */ @Override public void writeLine(String str) { // Logcat actually writes in a new line every time, so we need to rewrite it @@ -231,6 +276,14 @@ private Logger getLogger() { // Request Id generator private final AtomicInteger nextRequestId = new AtomicInteger(0); + /** + * Intercept the {@link ParseHttpRequest} and {@link ParseHttpResponse}. + * @param chain + * The helper chain we use to get the {@link ParseHttpRequest}, proceed the + * {@link ParseHttpRequest} and receive the {@link ParseHttpResponse}. + * @return The intercept {@link ParseHttpResponse}. + * @throws IOException + */ @Override public ParseHttpResponse intercept(Chain chain) throws IOException { // Intercept request diff --git a/ParseNetworkLogger/src/main/java/com/parse/ParseStethoInterceptor.java b/ParseNetworkLogger/src/main/java/com/parse/ParseStethoInterceptor.java index cc0c24155..d16648d8e 100644 --- a/ParseNetworkLogger/src/main/java/com/parse/ParseStethoInterceptor.java +++ b/ParseNetworkLogger/src/main/java/com/parse/ParseStethoInterceptor.java @@ -225,6 +225,14 @@ public String firstHeaderValue(String name) { // Request Id generator private final AtomicInteger nextRequestId = new AtomicInteger(0); + /** + * Intercept the {@link ParseHttpRequest} and {@link ParseHttpResponse}. + * @param chain + * The helper chain we use to get the {@link ParseHttpRequest}, proceed the + * {@link ParseHttpRequest} and receive the {@link ParseHttpResponse}. + * @return The intercepted {@link ParseHttpResponse}. + * @throws IOException + */ @Override public ParseHttpResponse intercept(Chain chain) throws IOException { // Intercept request