From 04c6e84ca7b883b4a7ac6598f1b9641d334fc1a3 Mon Sep 17 00:00:00 2001 From: Matheus Amelco Date: Tue, 5 Dec 2017 23:09:32 -0200 Subject: [PATCH 1/2] Issue #1 - All RESTful methods of Realtime Database --- .idea/compiler.xml | 9 + .idea/copyright/Apache_2_0.xml | 5 + .idea/copyright/profiles_settings.xml | 3 + .idea/misc.xml | 6 + .idea/modules.xml | 10 + .idea/modules/Firebase4J.iml | 13 ++ .idea/modules/Firebase4J_main.iml | 16 ++ .idea/modules/Firebase4J_test.iml | 20 ++ .idea/vcs.xml | 6 + build.gradle | 17 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54706 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++++++++++++ gradlew.bat | 84 +++++++ settings.gradle | 2 + .../com/matheusamelco/RealtimeDatabase.java | 208 ++++++++++++++++++ .../exception/RealtimeDatabaseException.java | 41 ++++ .../model/RealtimeDatabaseResponse.java | 83 +++++++ .../com/matheusamelco/util/HttpUtils.java | 131 +++++++++++ 19 files changed, 832 insertions(+) create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/Apache_2_0.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/modules/Firebase4J.iml create mode 100644 .idea/modules/Firebase4J_main.iml create mode 100644 .idea/modules/Firebase4J_test.iml create mode 100644 .idea/vcs.xml create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/matheusamelco/RealtimeDatabase.java create mode 100644 src/main/java/com/matheusamelco/exception/RealtimeDatabaseException.java create mode 100644 src/main/java/com/matheusamelco/model/RealtimeDatabaseResponse.java create mode 100644 src/main/java/com/matheusamelco/util/HttpUtils.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..0c63405 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/Apache_2_0.xml b/.idea/copyright/Apache_2_0.xml new file mode 100644 index 0000000..3b80ccc --- /dev/null +++ b/.idea/copyright/Apache_2_0.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..09e2386 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e208459 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..f66e8af --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/Firebase4J.iml b/.idea/modules/Firebase4J.iml new file mode 100644 index 0000000..b7414f1 --- /dev/null +++ b/.idea/modules/Firebase4J.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/Firebase4J_main.iml b/.idea/modules/Firebase4J_main.iml new file mode 100644 index 0000000..ffa08d8 --- /dev/null +++ b/.idea/modules/Firebase4J_main.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/Firebase4J_test.iml b/.idea/modules/Firebase4J_test.iml new file mode 100644 index 0000000..4ce41d6 --- /dev/null +++ b/.idea/modules/Firebase4J_test.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..43a566e --- /dev/null +++ b/build.gradle @@ -0,0 +1,17 @@ +group 'com.matheusamelco' +version '1.0' + +apply plugin: 'java' + +sourceCompatibility = 1.8 + +repositories { + mavenCentral() +} + +dependencies { + testCompile group: 'junit', name: 'junit', version: '4.12' + + implementation 'com.squareup.okhttp3:okhttp:3.9.1' + implementation 'org.json:json:20171018' +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2a8015cb9aaa59e7242509863ffc98d8b76a6b24 GIT binary patch literal 54706 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..27821e9 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Dec 05 22:07:34 BRST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-all.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..e95643d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..f0cb8fe --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'Firebase4J' + diff --git a/src/main/java/com/matheusamelco/RealtimeDatabase.java b/src/main/java/com/matheusamelco/RealtimeDatabase.java new file mode 100644 index 0000000..37d9a48 --- /dev/null +++ b/src/main/java/com/matheusamelco/RealtimeDatabase.java @@ -0,0 +1,208 @@ +/* + * Copyright 2017 Matheus Felipe Amelco + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.matheusamelco; + +import com.matheusamelco.exception.RealtimeDatabaseException; +import com.matheusamelco.model.RealtimeDatabaseResponse; +import com.matheusamelco.util.HttpUtils; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.json.JSONObject; + +/** + * RealtimeDatabase + * + * @author Matheus Felipe Amelco + * @since 05/12/2017 + */ +public final class RealtimeDatabase { + private static final int GET = 1; + private static final int PUT = 2; + private static final int PATCH = 3; + private static final int POST = 4; + private static final int DELETE = 5; + + private final String url; + private int method; + private JSONObject data; + + public RealtimeDatabase(Builder builder) { + this.url = builder.baseUrl; + this.method = builder.method; + this.data = builder.data; + } + + /** + * @return + * @throws RealtimeDatabaseException + */ + public RealtimeDatabaseResponse makeRequest() throws RealtimeDatabaseException { + Response reponse = null; + + switch (method) { + case GET: + reponse = HttpUtils.get(url); + break; + case PUT: + reponse = HttpUtils.put(url, data); + break; + case PATCH: + reponse = HttpUtils.patch(url, data); + break; + case POST: + reponse = HttpUtils.post(url, data); + break; + case DELETE: + reponse = HttpUtils.delete(url); + break; + default: + break; + } + + return this.processResponse(reponse); + } + + /** + * Builder class + */ + public static class Builder { + + private String baseUrl; + private String secureToken = null; + private boolean isSilent; + private int method; + private JSONObject data; + + public Builder() { + this.baseUrl = ""; + this.secureToken = ""; + this.isSilent = false; + } + + public Builder url(String url) { + this.baseUrl = url; + return this; + } + + public Builder token(String token) { + this.secureToken = token; + return this; + } + + public Builder silent(boolean silent) { + this.isSilent = silent; + return this; + } + + public Builder get() { + return method(GET, null); + } + + public Builder delete() { + return method(DELETE, null); + } + + public Builder post(JSONObject data) { + return method(POST, data); + } + + public Builder put(JSONObject data) { + return method(PUT, data); + } + + public Builder patch(JSONObject data) { + return method(PATCH, data); + } + + Builder method(int method, JSONObject body) { + if (method == 0) { + throw new NullPointerException("method == 0"); + } + + if (body == null && (method == PATCH || method == PUT || method == POST)) { + throw new IllegalArgumentException("method " + method + " must have a request body."); + } + + this.method = method; + this.data = body; + return this; + } + + public RealtimeDatabase build() { + if (baseUrl == null) { + throw new IllegalStateException("url == null"); + } + + baseUrl = buildFullUri(); + + return new RealtimeDatabase(this); + } + + /** + * Assemble URL with baseUrl + secureToken + isSilent. + * + * @return + */ + private String buildFullUri() { + String url = this.baseUrl + ".json"; + + if (secureToken != null) { + url += "?auth=" + secureToken; + } + + if (isSilent) { + url += "?print=silent"; + } + + return url; + } + } + + + /** + * Interprets the response from the HTTP/s request made to Firebase. + * + * @param httpResponse + * @return + * @throws RealtimeDatabaseException + */ + private RealtimeDatabaseResponse processResponse(Response httpResponse) throws RealtimeDatabaseException { + if (httpResponse == null) { + throw new RealtimeDatabaseException("HttpResponse can not be null!"); + } + + ResponseBody body = httpResponse.body(); + int code = httpResponse.code(); + boolean success = false; + + switch (code) { + case 200: + success = true; + break; + case 204: + success = true; + break; + default: + break; + } + + return new RealtimeDatabaseResponse( + httpResponse.isSuccessful() && success, + code, + (body != null ? body.toString() : "")); + } +} \ No newline at end of file diff --git a/src/main/java/com/matheusamelco/exception/RealtimeDatabaseException.java b/src/main/java/com/matheusamelco/exception/RealtimeDatabaseException.java new file mode 100644 index 0000000..6643537 --- /dev/null +++ b/src/main/java/com/matheusamelco/exception/RealtimeDatabaseException.java @@ -0,0 +1,41 @@ +/* + * Copyright 2017 Matheus Felipe Amelco + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.matheusamelco.exception; + +/** + * Exception for RealtimeDatabase methods. + * + * @author Matheus Felipe Amelco + * @since 05/12/2017 + */ +public class RealtimeDatabaseException extends Throwable { + + /** + * @param message + */ + public RealtimeDatabaseException(String message) { + super(message); + } + + /** + * @param message - Message about the exception + * @param cause - + */ + public RealtimeDatabaseException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/matheusamelco/model/RealtimeDatabaseResponse.java b/src/main/java/com/matheusamelco/model/RealtimeDatabaseResponse.java new file mode 100644 index 0000000..99ca917 --- /dev/null +++ b/src/main/java/com/matheusamelco/model/RealtimeDatabaseResponse.java @@ -0,0 +1,83 @@ +/* + * Copyright 2017 Matheus Felipe Amelco + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.matheusamelco.model; + +/** + * RealtimeDatabase + * + * @author Matheus Felipe Amelco + * @since 05/12/2017 + */ +public class RealtimeDatabaseResponse { + + private final boolean success; + private final int code; + private final String message; + + public RealtimeDatabaseResponse(boolean success, int code, String message) { + this.success = success; + this.code = code; + this.message = message.trim(); + } + + /** + * Returns whether the request to Firebase was successful. + * + * @return boolean - If true, the request to Firebase was successful. + */ + public boolean getSuccess() { + return this.success; + } + + /** + * Returns the HTTP/s status code of the Firebase response. + * + * @return Integer - Represents the HTTP/s status code. + */ + public int getCode() { + return this.code; + } + + /** + * Returns a JSONObject with the response message from Firebase. + * + * @return JSONObject - Json containing the response message from the + * firebase. + */ + public String getMsg() { + return this.message; + } + + /** + * Returns all data coming from the Firebase response. + * + * @return String - All data coming from the Firebase response. + */ + public String getResponse() { + + return RealtimeDatabaseResponse.class.getSimpleName() + " [" + + "(Success:" + this.success + ") " + + "(Code:" + this.code + ") " + + "(Msg:" + this.message + ") " + + "]"; + } + + @Override + public String toString() { + return this.getResponse(); + } +} \ No newline at end of file diff --git a/src/main/java/com/matheusamelco/util/HttpUtils.java b/src/main/java/com/matheusamelco/util/HttpUtils.java new file mode 100644 index 0000000..47d960e --- /dev/null +++ b/src/main/java/com/matheusamelco/util/HttpUtils.java @@ -0,0 +1,131 @@ +/* + * Copyright 2017 Matheus Felipe Amelco + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.matheusamelco.util; + +import com.matheusamelco.exception.RealtimeDatabaseException; +import okhttp3.*; +import org.json.JSONObject; + +import java.io.IOException; + +/** + * RealtimeDatabase + * + * @author Matheus Felipe Amelco + * @since 05/12/2017 + */ +public abstract class HttpUtils { + + private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); + + /** + * @param url + * @return + * @throws IOException + */ + public static Response get(String url) throws RealtimeDatabaseException { + Request request = new Request.Builder() + .url(url) + .get() + .build(); + + return makeRequest(request); + } + + /** + * @param url + * @return + * @throws IOException + */ + public static Response put(String url, JSONObject data) throws RealtimeDatabaseException { + RequestBody body = RequestBody.create(JSON, data.toString()); + + Request request = new Request.Builder() + .url(url) + .put(body) + .build(); + + return makeRequest(request); + } + + /** + * @param url + * @return + * @throws IOException + */ + public static Response patch(String url, JSONObject data) throws RealtimeDatabaseException { + RequestBody body = RequestBody.create(JSON, data.toString()); + + Request request = new Request.Builder() + .url(url) + .patch(body) + .build(); + + return makeRequest(request); + } + + /** + * @param url + * @param data + * @return + * @throws IOException + */ + public static Response post(String url, JSONObject data) throws RealtimeDatabaseException { + RequestBody body = RequestBody.create(JSON, data.toString()); + + Request request = new Request.Builder() + .url(url) + .post(body) + .build(); + + return makeRequest(request); + } + + + /** + * @param url + * @return + * @throws IOException + */ + public static Response delete(String url) throws RealtimeDatabaseException { + Request request = new Request.Builder() + .url(url) + .delete() + .build(); + + return makeRequest(request); + } + + /** + * @param request + * @return + * @throws RealtimeDatabaseException + */ + private static Response makeRequest(Request request) throws RealtimeDatabaseException { + Response response; + + try { + OkHttpClient client = new OkHttpClient(); + response = client.newCall(request).execute(); + + } catch (IOException e) { + throw new RealtimeDatabaseException("Could not receive response from request (" + request.method() + ") @ " + request.url(), e); + } + + return response; + } +} \ No newline at end of file From 4c7292575b5f8774646640b4af1b2c799bcfd6db Mon Sep 17 00:00:00 2001 From: Matheus Amelco Date: Mon, 18 Dec 2017 11:31:07 -0200 Subject: [PATCH 2/2] Correction --- .../com/matheusamelco/RealtimeDatabase.java | 24 ++++++++++++------- .../com/matheusamelco/util/HttpUtils.java | 6 +++-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/matheusamelco/RealtimeDatabase.java b/src/main/java/com/matheusamelco/RealtimeDatabase.java index 37d9a48..c54d9ed 100644 --- a/src/main/java/com/matheusamelco/RealtimeDatabase.java +++ b/src/main/java/com/matheusamelco/RealtimeDatabase.java @@ -30,6 +30,9 @@ * @since 05/12/2017 */ public final class RealtimeDatabase { + + // Constants + private static final int GET = 1; private static final int PUT = 2; private static final int PATCH = 3; @@ -40,6 +43,11 @@ public final class RealtimeDatabase { private int method; private JSONObject data; + /** + * Constructor + * + * @param builder - Requisition builder. + */ public RealtimeDatabase(Builder builder) { this.url = builder.baseUrl; this.method = builder.method; @@ -82,15 +90,15 @@ public RealtimeDatabaseResponse makeRequest() throws RealtimeDatabaseException { public static class Builder { private String baseUrl; - private String secureToken = null; - private boolean isSilent; + //private String secureToken; + // private boolean isSilent; private int method; private JSONObject data; public Builder() { this.baseUrl = ""; - this.secureToken = ""; - this.isSilent = false; + //this.secureToken = ""; + //this.isSilent = false; } public Builder url(String url) { @@ -98,7 +106,7 @@ public Builder url(String url) { return this; } - public Builder token(String token) { + /* public Builder token(String token) { this.secureToken = token; return this; } @@ -106,7 +114,7 @@ public Builder token(String token) { public Builder silent(boolean silent) { this.isSilent = silent; return this; - } + }*/ public Builder get() { return method(GET, null); @@ -160,13 +168,13 @@ public RealtimeDatabase build() { private String buildFullUri() { String url = this.baseUrl + ".json"; - if (secureToken != null) { + /* if (secureToken != null) { url += "?auth=" + secureToken; } if (isSilent) { url += "?print=silent"; - } + }*/ return url; } diff --git a/src/main/java/com/matheusamelco/util/HttpUtils.java b/src/main/java/com/matheusamelco/util/HttpUtils.java index 47d960e..614711d 100644 --- a/src/main/java/com/matheusamelco/util/HttpUtils.java +++ b/src/main/java/com/matheusamelco/util/HttpUtils.java @@ -48,8 +48,9 @@ public static Response get(String url) throws RealtimeDatabaseException { /** * @param url + * @param data * @return - * @throws IOException + * @throws RealtimeDatabaseException */ public static Response put(String url, JSONObject data) throws RealtimeDatabaseException { RequestBody body = RequestBody.create(JSON, data.toString()); @@ -64,8 +65,9 @@ public static Response put(String url, JSONObject data) throws RealtimeDatabaseE /** * @param url + * @param data * @return - * @throws IOException + * @throws RealtimeDatabaseException */ public static Response patch(String url, JSONObject data) throws RealtimeDatabaseException { RequestBody body = RequestBody.create(JSON, data.toString());