diff --git a/.travis.yml b/.travis.yml
index 69fb0cd9adb..09bd709a6dc 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,6 +21,7 @@ addons:
- expect
before_install:
- openssl aes-256-cbc -K $encrypted_37a4f399de75_key -iv $encrypted_37a4f399de75_iv -in service-account.json.enc -out service-account.json -d
+ && openssl aes-256-cbc -K $encrypted_37a4f399de75_key -iv $encrypted_37a4f399de75_iv -in service-account.json.enc -out appengine/firebase-event-proxy/gae-firebase-event-proxy/src/main/webapp/gae-firebase-secrets.json -d
&& export GOOGLE_APPLICATION_CREDENTIALS=$TRAVIS_BUILD_DIR/service-account.json GCLOUD_PROJECT=cloud-samples-tests
|| true
# Skip the install step, since Maven will download the dependencies we need
diff --git a/appengine/firebase-event-proxy/README.md b/appengine/firebase-event-proxy/README.md
index eeb8b4ac107..880c26ea1da 100644
--- a/appengine/firebase-event-proxy/README.md
+++ b/appengine/firebase-event-proxy/README.md
@@ -32,7 +32,7 @@ mvn appengine:devserver
### Python App Engine Listener
```
cd gae-firebase-listener-python
-dev_appserver .
+dev_appserver.py .
```
## Deploying
diff --git a/appengine/firebase-event-proxy/gae-firebase-event-proxy/pom.xml b/appengine/firebase-event-proxy/gae-firebase-event-proxy/pom.xml
index 4554b7dc37c..ec1a518871f 100644
--- a/appengine/firebase-event-proxy/gae-firebase-event-proxy/pom.xml
+++ b/appengine/firebase-event-proxy/gae-firebase-event-proxy/pom.xml
@@ -55,9 +55,9 @@
1.2
- com.firebase
- firebase-client-jvm
- [1.0.8,)
+ com.google.firebase
+ firebase-server-sdk
+ [3.0.0,)
com.fasterxml.jackson.core
@@ -65,9 +65,9 @@
2.7.3
- com.firebase
- firebase-token-generator
- 2.0.0
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.5.3
diff --git a/appengine/firebase-event-proxy/gae-firebase-event-proxy/src/main/java/com/example/GaeFirebaseEventProxy/FirebaseEventProxy.java b/appengine/firebase-event-proxy/gae-firebase-event-proxy/src/main/java/com/example/GaeFirebaseEventProxy/FirebaseEventProxy.java
index 4c67beb5d14..fd2d1d0358c 100644
--- a/appengine/firebase-event-proxy/gae-firebase-event-proxy/src/main/java/com/example/GaeFirebaseEventProxy/FirebaseEventProxy.java
+++ b/appengine/firebase-event-proxy/gae-firebase-event-proxy/src/main/java/com/example/GaeFirebaseEventProxy/FirebaseEventProxy.java
@@ -18,52 +18,49 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.firebase.client.AuthData;
-import com.firebase.client.DataSnapshot;
-import com.firebase.client.Firebase;
-import com.firebase.client.FirebaseError;
-import com.firebase.client.ValueEventListener;
-import com.firebase.security.token.TokenGenerator;
import com.google.appengine.api.utils.SystemProperty;
+import com.google.firebase.FirebaseApp;
+import com.google.firebase.FirebaseOptions;
+import com.google.firebase.database.DataSnapshot;
+import com.google.firebase.database.DatabaseError;
+import com.google.firebase.database.DatabaseReference;
+import com.google.firebase.database.FirebaseDatabase;
+import com.google.firebase.database.ValueEventListener;
import java.io.FileInputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
-import java.util.Properties;
import java.util.logging.Logger;
public class FirebaseEventProxy {
private static final Logger log = Logger.getLogger(FirebaseEventProxy.class.getName());
- private String firebaseAuthToken;
-
public FirebaseEventProxy() {
- // Store Firebase authentication token as an instance variable.
- this.firebaseAuthToken = this.getFirebaseAuthToken(this.getFirebaseSecret());
+ String firebaseLocation = "https://crackling-torch-392.firebaseio.com";
+ Map databaseAuthVariableOverride = new HashMap();
+ // uid and provider will have to match what you have in your firebase security rules
+ databaseAuthVariableOverride.put("uid", "gae-firebase-event-proxy");
+ databaseAuthVariableOverride.put("provider", "com.example");
+ try {
+ FirebaseOptions options = new FirebaseOptions.Builder()
+ .setServiceAccount(new FileInputStream("gae-firebase-secrets.json"))
+ .setDatabaseUrl(firebaseLocation)
+ .setDatabaseAuthVariableOverride(databaseAuthVariableOverride).build();
+ FirebaseApp.initializeApp(options);
+ } catch (IOException e) {
+ throw new RuntimeException(
+ "Error reading firebase secrets from file: src/main/webapp/gae-firebase-secrets.json: "
+ + e.getMessage());
+ }
}
public void start() {
- String firebaseLocation = "https://gae-fb-proxy.firebaseio.com/";
- Firebase firebase = new Firebase(firebaseLocation);
-
- // Authenticate with Firebase
- firebase.authWithCustomToken(this.firebaseAuthToken, new Firebase.AuthResultHandler() {
- @Override
- public void onAuthenticationError(FirebaseError error) {
- log.severe("Firebase login error: " + error.getMessage());
- }
-
- @Override
- public void onAuthenticated(AuthData auth) {
- log.info("Firebase login successful");
- }
- });
+ DatabaseReference firebase = FirebaseDatabase.getInstance().getReference();
// Subscribe to value events. Depending on use case, you may want to subscribe to child events
// through childEventListener.
@@ -73,10 +70,10 @@ public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
try {
// Convert value to JSON using Jackson
- String json = new ObjectMapper().writeValueAsString(snapshot.getValue());
+ String json = new ObjectMapper().writeValueAsString(snapshot.getValue(false));
// Replace the URL with the url of your own listener app.
- URL dest = new URL("http://gae-firebase-listener-python.appspot.com/log");
+ URL dest = new URL("http://localhost:8080/log");
HttpURLConnection connection = (HttpURLConnection) dest.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
@@ -109,36 +106,9 @@ public void onDataChange(DataSnapshot snapshot) {
}
@Override
- public void onCancelled(FirebaseError error) {
+ public void onCancelled(DatabaseError error) {
log.severe("Firebase connection cancelled: " + error.getMessage());
}
});
}
-
- private String getFirebaseSecret() {
- Properties props = new Properties();
- try {
- // Read from src/main/webapp/firebase-secrets.properties
- InputStream inputStream = new FileInputStream("firebase-secret.properties");
- props.load(inputStream);
- return props.getProperty("firebaseSecret");
- } catch (java.net.MalformedURLException e) {
- throw new RuntimeException(
- "Error reading firebase secrets from file: src/main/webapp/firebase-sercrets.properties: "
- + e.getMessage());
- } catch (IOException e) {
- throw new RuntimeException(
- "Error reading firebase secrets from file: src/main/webapp/firebase-sercrets.properties: "
- + e.getMessage());
- }
- }
-
- private String getFirebaseAuthToken(String firebaseSecret) {
- Map authPayload = new HashMap();
- // uid and provider will have to match what you have in your firebase security rules
- authPayload.put("uid", "gae-firebase-event-proxy");
- authPayload.put("provider", "com.example");
- TokenGenerator tokenGenerator = new TokenGenerator(firebaseSecret);
- return tokenGenerator.createToken(authPayload);
- }
}
diff --git a/appengine/firebase-event-proxy/gae-firebase-listener-python/main.py b/appengine/firebase-event-proxy/gae-firebase-listener-python/main.py
index 49145bbd749..e7bee2fc525 100644
--- a/appengine/firebase-event-proxy/gae-firebase-listener-python/main.py
+++ b/appengine/firebase-event-proxy/gae-firebase-listener-python/main.py
@@ -29,7 +29,7 @@ def post(self):
user = self.request.headers.get('X-Appengine-Inbound-Appid', None)
if user and user in allowed_users:
firebaseSnapshot = self.request.params['fbSnapshot']
- print firebaseSnapshot
+ print "Got data: %s" % firebaseSnapshot
else:
print "Got unauthenticated user: %s" % user
diff --git a/appengine/firebase-event-proxy/run_tests.sh b/appengine/firebase-event-proxy/run_tests.sh
new file mode 100755
index 00000000000..b8ff6c061da
--- /dev/null
+++ b/appengine/firebase-event-proxy/run_tests.sh
@@ -0,0 +1,39 @@
+#!/usr/bin/env bash
+# Copyright 2016 Google Inc. All Rights Reserved.
+#
+# 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.
+
+set -e
+set -x
+
+# Expected to run this file from root of GitHub project.
+(
+cd appengine/firebase-event-proxy/
+
+expect -c '
+spawn dev_appserver.py gae-firebase-listener-python
+set python_listener_id $spawn_id
+spawn mvn --file gae-firebase-event-proxy appengine:devserver -Dappengine.port=8888
+set event_proxy_id $spawn_id
+expect {
+ # Listen for Got data from Python listener
+ -i $python_listener_id "Got data" {
+ exit
+ } -i $event_proxy_id "Sent" {
+ send_user Event proxy sent data successful
+ }
+}
+sleep 20
+exit 1
+'
+)
diff --git a/travis.sh b/travis.sh
index f7677604fab..7e23edeebb0 100755
--- a/travis.sh
+++ b/travis.sh
@@ -36,3 +36,4 @@ for testdir in ${devserver_tests[@]} ; do
./java-repo-tools/test-devserver.sh "${testdir}"
done
+appengine/firebase-event-proxy/run_tests.sh