From ac5cb5d77d81485ad4ff0eb3299a8a5b49b1e6bd Mon Sep 17 00:00:00 2001 From: "burke.davey" Date: Thu, 16 Sep 2010 23:28:25 +0000 Subject: [PATCH] Fix JDO so it returns blank not null strings. All unregistration to prune multiple devices (in case duplicates were accidentally introduced inan unorthodox upgrade. Misc cleanups. --- .../chrometophone/server/DeviceInfo.java | 40 ++++++++++--------- .../chrometophone/server/RegisterServlet.java | 2 +- .../chrometophone/server/SendServlet.java | 35 ++++++++-------- .../server/UnregisterServlet.java | 3 +- appengine/war/WEB-INF/appengine-web.xml | 2 +- 5 files changed, 43 insertions(+), 39 deletions(-) diff --git a/appengine/src/com/google/android/chrometophone/server/DeviceInfo.java b/appengine/src/com/google/android/chrometophone/server/DeviceInfo.java index f2526e6..70c261d 100644 --- a/appengine/src/com/google/android/chrometophone/server/DeviceInfo.java +++ b/appengine/src/com/google/android/chrometophone/server/DeviceInfo.java @@ -97,6 +97,24 @@ public class DeviceInfo { this.key = key; } + public Key getKey() { + return key; + } + + public void setKey(Key key) { + this.key = key; + } + + // Accessor methods for properties added later (hence can be null) + + public String getDeviceRegistrationID() { + return deviceRegistrationID; + } + + public void setDeviceRegistrationID(String deviceRegistrationID) { + this.deviceRegistrationID = deviceRegistrationID; + } + public boolean getDebug() { return (debug != null ? debug.booleanValue() : false); } @@ -114,28 +132,12 @@ public class DeviceInfo { this.phoneToChromeExperimentEnabled = new Boolean(phoneToChromeExperimentEnabled); } - public Key getKey() { - return key; - } - - public void setKey(Key key) { - this.key = key; - } - - public String getDeviceRegistrationID() { - return deviceRegistrationID; - } - - public void setDeviceRegistrationID(String deviceRegistrationID) { - this.deviceRegistrationID = deviceRegistrationID; - } - public void setType(String type) { this.type = type; } public String getType() { - return type; + return type != null ? type : ""; } public void setName(String name) { @@ -143,7 +145,7 @@ public class DeviceInfo { } public String getName() { - return name; + return name != null ? name : ""; } public void setRegistrationTimestamp(Date registrationTimestamp) { @@ -165,7 +167,7 @@ public class DeviceInfo { List qresult = (List) query.execute(); // Copy to array - we need to close the query List result = new ArrayList(); - for (DeviceInfo di: qresult) { + for (DeviceInfo di : qresult) { result.add(di); } query.closeAll(); diff --git a/appengine/src/com/google/android/chrometophone/server/RegisterServlet.java b/appengine/src/com/google/android/chrometophone/server/RegisterServlet.java index 2865cc9..78994b1 100644 --- a/appengine/src/com/google/android/chrometophone/server/RegisterServlet.java +++ b/appengine/src/com/google/android/chrometophone/server/RegisterServlet.java @@ -160,7 +160,7 @@ public class RegisterServlet extends HttpServlet { device.setName(deviceName); // update display name - if (device.getType() != null && device.getType().equals(DeviceInfo.TYPE_CHROME)) { + if (device.getType().equals(DeviceInfo.TYPE_CHROME)) { if (device.getPhoneToChromeExperimentEnabled()) { String channelId = ChannelServiceFactory.getChannelService().createChannel(deviceRegistrationId); diff --git a/appengine/src/com/google/android/chrometophone/server/SendServlet.java b/appengine/src/com/google/android/chrometophone/server/SendServlet.java index 4bc88b8..f9d1cf2 100644 --- a/appengine/src/com/google/android/chrometophone/server/SendServlet.java +++ b/appengine/src/com/google/android/chrometophone/server/SendServlet.java @@ -68,7 +68,6 @@ public class SendServlet extends HttpServlet { String deviceName = req.getParameter("deviceName"); String deviceType = req.getParameter("deviceType"); - if (deviceType == null) deviceType = DeviceInfo.TYPE_AC2DM; // default User user = RegisterServlet.checkUser(req, resp, false); if (user != null) { @@ -82,7 +81,7 @@ public class SendServlet extends HttpServlet { private boolean doSendToDevice(String url, String title, String sel, String userAccount, String deviceName, String deviceType, HttpServletResponse resp) throws IOException { - // ok = we sent to at least one phone. + // ok = we sent to at least one device. boolean ok = false; // Send push message to phone @@ -101,29 +100,22 @@ public class SendServlet extends HttpServlet { pm.close(); } - if (registrations.size() == 0) { - log.warning("Device not registered " + userAccount); - resp.getWriter().println(DEVICE_NOT_REGISTERED_STATUS); - return false; - } - + int numSendAttempts = 0; for (DeviceInfo deviceInfo : registrations) { - if (deviceName != null && deviceInfo.getName() != null && - !deviceName.equals(deviceInfo.getName())) { + if (deviceName != null && !deviceName.equals(deviceInfo.getName())) { continue; // user-specified device name } - if (deviceType != null && deviceInfo.getType() != null && - !deviceType.equals(deviceInfo.getType())) { + if (deviceType != null && !deviceType.equals(deviceInfo.getType())) { continue; // user-specified device type } - // if name or value are null - they'll be skipped try { - if (deviceInfo.getType() != null && deviceInfo.getType().equals(DeviceInfo.TYPE_CHROME)) { + if (deviceInfo.getType().equals(DeviceInfo.TYPE_CHROME)) { res = doSendViaBrowserChannel(url, deviceInfo); } else { res = doSendViaC2dm(url, title, sel, push, collapseKey, deviceInfo); } + numSendAttempts++; if (res) { log.info("Link sent to phone! collapse_key:" + collapseKey); @@ -134,8 +126,8 @@ public class SendServlet extends HttpServlet { } catch (IOException ex) { if ("NotRegistered".equals(ex.getMessage()) || "InvalidRegistration".equals(ex.getMessage())) { - // remove registrations, it no longer works - pm.deletePersistent(deviceInfo); + // Prune device, it no longer works + pruneDevice(deviceInfo); } else { throw ex; } @@ -145,6 +137,10 @@ public class SendServlet extends HttpServlet { if (ok) { resp.getWriter().println(OK_STATUS); return true; + } else if (numSendAttempts == 0) { + log.warning("Device not registered " + userAccount); + resp.getWriter().println(DEVICE_NOT_REGISTERED_STATUS); + return false; } else { resp.setStatus(500); resp.getWriter().println(ERROR_STATUS + " (Unable to send link)"); @@ -152,6 +148,13 @@ public class SendServlet extends HttpServlet { } } + private void pruneDevice(DeviceInfo deviceInfo) { + PersistenceManager pm = + C2DMessaging.getPMF(getServletContext()).getPersistenceManager(); + pm.deletePersistent(deviceInfo); + pm.close(); + } + boolean doSendViaC2dm(String url, String title, String sel, C2DMessaging push, String collapseKey, DeviceInfo deviceInfo) throws IOException { diff --git a/appengine/src/com/google/android/chrometophone/server/UnregisterServlet.java b/appengine/src/com/google/android/chrometophone/server/UnregisterServlet.java index 40ccfe8..d553b40 100644 --- a/appengine/src/com/google/android/chrometophone/server/UnregisterServlet.java +++ b/appengine/src/com/google/android/chrometophone/server/UnregisterServlet.java @@ -68,8 +68,7 @@ public class UnregisterServlet extends HttpServlet { DeviceInfo deviceInfo = registrations.get(i); if (deviceInfo.getDeviceRegistrationID().equals(deviceRegistrationID)) { pm.deletePersistent(deviceInfo); - registrations.remove(i); - break; + // Keep looping in case of duplicates } } diff --git a/appengine/war/WEB-INF/appengine-web.xml b/appengine/war/WEB-INF/appengine-web.xml index 44e2894..65bdd16 100644 --- a/appengine/war/WEB-INF/appengine-web.xml +++ b/appengine/war/WEB-INF/appengine-web.xml @@ -16,7 +16,7 @@ --> chrometophone - 6 + 7