You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2014/10/29 20:21:52 UTC

[11/22] git commit: refactor static classes out of adapters

refactor static classes out of adapters


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/0f4584c4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/0f4584c4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/0f4584c4

Branch: refs/heads/two-dot-o-events
Commit: 0f4584c47a775d97d0b2f3e297e5a5be8b06a31b
Parents: ad0cce9
Author: Shawn Feldman <sf...@apache.org>
Authored: Wed Oct 29 09:50:03 2014 -0600
Committer: Shawn Feldman <sf...@apache.org>
Committed: Wed Oct 29 09:50:03 2014 -0600

----------------------------------------------------------------------
 .../usergrid/persistence/entities/Notifier.java |   5 -
 .../notifications/ApplicationQueueManager.java  |  76 ++++++-----
 .../notifications/InactiveDeviceManager.java    |  13 +-
 .../notifications/NotificationsService.java     |  24 +---
 .../services/notifications/ProviderAdapter.java |  12 +-
 .../notifications/ProviderAdapterFactory.java   |  49 ++++++++
 .../services/notifications/QueueListener.java   |  65 +++++++---
 .../services/notifications/TestAdapter.java     |  21 +++-
 .../notifications/apns/APNsAdapter.java         | 126 +++++++------------
 .../notifications/apns/EntityPushManager.java   |   6 +-
 .../apns/ExpiredTokenListener.java              |   2 +-
 .../services/notifications/gcm/GCMAdapter.java  |  32 +++--
 .../services/notifiers/NotifiersService.java    |  23 ++--
 .../notifications/NotifiersServiceIT.java       |  33 +----
 .../apns/MockSuccessfulProviderAdapter.java     |  37 ++----
 .../apns/NotificationsServiceIT.java            |  43 ++-----
 .../gcm/MockSuccessfulProviderAdapter.java      |  31 ++---
 .../gcm/NotificationsServiceIT.java             |  74 -----------
 18 files changed, 292 insertions(+), 380 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/core/src/main/java/org/apache/usergrid/persistence/entities/Notifier.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/entities/Notifier.java b/stack/core/src/main/java/org/apache/usergrid/persistence/entities/Notifier.java
index ba3f2fc..819ccde 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/entities/Notifier.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/entities/Notifier.java
@@ -132,10 +132,5 @@ public class Notifier extends TypedEntity {
         this.apiKey = apiKey;
     }
 
-    @JsonIgnore
-    public EntityManager getEntityManager(){return entityManager;}
-
-    public void setEntityManager(EntityManager entityManager){ this.entityManager = entityManager;}
-
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
index 3fd84a6..11b197c 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
@@ -39,6 +39,7 @@ import rx.functions.Action1;
 import rx.functions.Func1;
 import rx.schedulers.Schedulers;
 
+import java.security.Provider;
 import java.util.*;
 import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -61,9 +62,7 @@ public class ApplicationQueueManager  {
     private final MetricsFactory metricsFactory;
     private final String queueName;
 
-    HashMap<Object, Notifier> notifierHashMap; // only retrieve notifiers once
-
-    public final Map<String, ProviderAdapter> providerAdapters;
+    HashMap<Object, ProviderAdapter> notifierHashMap; // only retrieve notifiers once
 
 
     public ApplicationQueueManager(JobScheduler jobScheduler, EntityManager entityManager, QueueManager queueManager, MetricsFactory metricsFactory, Properties properties){
@@ -72,12 +71,7 @@ public class ApplicationQueueManager  {
         this.jobScheduler = jobScheduler;
         this.metricsFactory = metricsFactory;
         this.queueName = getQueueNames(properties);
-        providerAdapters =   new HashMap<String, ProviderAdapter>(3);
-        {
-            providerAdapters.put("apple", new APNsAdapter());
-            providerAdapters.put("google", new GCMAdapter());
-            providerAdapters.put("noop", new TestAdapter());
-        };
+
     }
 
     public boolean scheduleQueueJob(Notification notification) throws Exception{
@@ -106,7 +100,7 @@ public class ApplicationQueueManager  {
         final AtomicInteger deviceCount = new AtomicInteger(); //count devices so you can make a judgement on batching
         final ConcurrentLinkedQueue<String> errorMessages = new ConcurrentLinkedQueue<String>(); //build up list of issues
 
-        final HashMap<Object,Notifier> notifierMap =  getNotifierMap();
+        final HashMap<Object,ProviderAdapter> notifierMap =  getNotifierMap();
 
         //get devices in querystring, and make sure you have access
         if (pathQuery != null) {
@@ -147,9 +141,9 @@ public class ApplicationQueueManager  {
 
                             //find the device notifier info, match it to the payload
                             for (Map.Entry<String, Object> entry : payloads.entrySet()) {
-                                Notifier notifier = notifierMap.get(entry.getKey().toLowerCase());
+                                ProviderAdapter adapter = notifierMap.get(entry.getKey().toLowerCase());
                                 now = System.currentTimeMillis();
-                                String providerId = getProviderId(deviceRef, notifier);
+                                String providerId = getProviderId(deviceRef, adapter.getNotifier());
                                 if (providerId != null) {
                                     notifierId = providerId;
                                     notifierKey = entry.getKey().toLowerCase();
@@ -236,10 +230,10 @@ public class ApplicationQueueManager  {
      * only need to get notifiers once. will reset on next batch
      * @return
      */
-    public HashMap<Object,Notifier> getNotifierMap(){
+    public HashMap<Object,ProviderAdapter> getNotifierMap(){
         if(notifierHashMap == null) {
             long now = System.currentTimeMillis();
-            notifierHashMap = new HashMap<Object, Notifier>();
+            notifierHashMap = new HashMap<Object, ProviderAdapter>();
             Query query = new Query();
             query.setCollection("notifiers");
             query.setLimit(100);
@@ -251,12 +245,12 @@ public class ApplicationQueueManager  {
             int count = 0;
             while (notifierIterator.hasNext()) {
                 Notifier notifier = notifierIterator.next();
-                notifier.setEntityManager(em);
                 String name = notifier.getName() != null ? notifier.getName() : "";
                 UUID uuid = notifier.getUuid() != null ? notifier.getUuid() : UUID.randomUUID();
-                notifierHashMap.put(name.toLowerCase(), notifier);
-                notifierHashMap.put(uuid, notifier);
-                notifierHashMap.put(uuid.toString(), notifier);
+                ProviderAdapter providerAdapter = ProviderAdapterFactory.getProviderAdapter(notifier,em);
+                notifierHashMap.put(name.toLowerCase(), providerAdapter);
+                notifierHashMap.put(uuid, providerAdapter);
+                notifierHashMap.put(uuid.toString(), providerAdapter);
                 if(count++ >= 100){
                     LOG.error("ApplicationQueueManager: too many notifiers...breaking out ", notifierHashMap.size());
                     break;
@@ -276,7 +270,7 @@ public class ApplicationQueueManager  {
         LOG.info("sending batch of {} notifications.", messages.size());
         final Meter sendMeter = metricsFactory.getMeter(NotificationsService.class, "send");
 
-        final Map<Object, Notifier> notifierMap = getNotifierMap();
+        final Map<Object, ProviderAdapter> notifierMap = getNotifierMap();
         final ApplicationQueueManager proxy = this;
         final ConcurrentHashMap<UUID,TaskManager> taskMap = new ConcurrentHashMap<UUID, TaskManager>(messages.size());
         final ConcurrentHashMap<UUID,Notification> notificationMap = new ConcurrentHashMap<UUID, Notification>(messages.size());
@@ -310,10 +304,10 @@ public class ApplicationQueueManager  {
 
                     try {
                         String notifierName = message.getNotifierKey().toLowerCase();
-                        Notifier notifier = notifierMap.get(notifierName.toLowerCase());
+                        ProviderAdapter providerAdapter = notifierMap.get(notifierName.toLowerCase());
                         Object payload = translatedPayloads.get(notifierName);
                         Receipt receipt = new Receipt(notification.getUuid(), message.getNotifierId(), payload, deviceUUID);
-                        TaskTracker tracker = new TaskTracker(notifier, taskManager, receipt, deviceUUID);
+                        TaskTracker tracker = new TaskTracker(providerAdapter.getNotifier(), taskManager, receipt, deviceUUID);
                         if(!isOkToSend(notification)){
                              tracker.failed(0, "Notification is duplicate/expired/cancelled.");
                         }else {
@@ -323,8 +317,7 @@ public class ApplicationQueueManager  {
                             } else {
                                 long now = System.currentTimeMillis();
                                 try {
-                                    ProviderAdapter providerAdapter = providerAdapters.get(notifier.getProvider());
-                                    providerAdapter.sendNotification(message.getNotifierId(), notifier, payload, notification, tracker);
+                                    providerAdapter.sendNotification(message.getNotifierId(), payload, notification, tracker);
                                 } catch (Exception e) {
                                     tracker.failed(0, e.getMessage());
                                 } finally {
@@ -362,7 +355,7 @@ public class ApplicationQueueManager  {
                     @Override
                     public HashMap<UUID, ApplicationQueueMessage> call(List<ApplicationQueueMessage> queueMessages) {
                         //for gcm this will actually send notification
-                        for (ProviderAdapter providerAdapter : providerAdapters.values()) {
+                        for (ProviderAdapter providerAdapter : notifierMap.values()) {
                             try {
                                 providerAdapter.doneSendingNotifications();
                             } catch (Exception e) {
@@ -395,24 +388,26 @@ public class ApplicationQueueManager  {
         return o;
     }
 
+    public void stop(){
+        for(ProviderAdapter adapter : getNotifierMap().values()){
+            adapter.stop();
+        }
+    }
+
 
     /**
      * Call the adapter with the notifier
      */
-    private Map<String, Object> translatePayloads(Map<String, Object> payloads, Map<Object, Notifier> notifierMap) throws Exception {
-        Map<String, Object> translatedPayloads = new HashMap<String, Object>(
-                payloads.size());
+    private Map<String, Object> translatePayloads(Map<String, Object> payloads, Map<Object, ProviderAdapter> notifierMap) throws Exception {
+        Map<String, Object> translatedPayloads = new HashMap<String, Object>(  payloads.size());
         for (Map.Entry<String, Object> entry : payloads.entrySet()) {
             String payloadKey = entry.getKey().toLowerCase();
             Object payloadValue = entry.getValue();
-            Notifier notifier = notifierMap.get(payloadKey);
-            if (notifier != null) {
-                ProviderAdapter providerAdapter = providerAdapters.get(notifier.getProvider());
-                if (providerAdapter != null) {
-                    Object translatedPayload = payloadValue != null ? providerAdapter.translatePayload(payloadValue) : null;
-                    if (translatedPayload != null) {
-                        translatedPayloads.put(payloadKey, translatedPayload);
-                    }
+            ProviderAdapter providerAdapter = notifierMap.get(payloadKey);
+            if (providerAdapter != null) {
+                Object translatedPayload = payloadValue != null ? providerAdapter.translatePayload(payloadValue) : null;
+                if (translatedPayload != null) {
+                    translatedPayloads.put(payloadKey, translatedPayload);
                 }
             }
         }
@@ -453,15 +448,14 @@ public class ApplicationQueueManager  {
     }
 
     public void asyncCheckForInactiveDevices() throws Exception {
-        Collection<Notifier> notifiers = getNotifierMap().values();
-        for (final Notifier notifier : notifiers) {
+        Collection<ProviderAdapter> providerAdapters = getNotifierMap().values();
+        for (final ProviderAdapter providerAdapter : providerAdapters) {
             try {
-                ProviderAdapter providerAdapter = providerAdapters.get(notifier.getProvider());
                 if (providerAdapter != null) {
-                    LOG.debug("checking notifier {} for inactive devices", notifier);
-                    providerAdapter.removeInactiveDevices(notifier, em);
+                    LOG.debug("checking notifier {} for inactive devices", providerAdapter.getNotifier());
+                    providerAdapter.removeInactiveDevices();
 
-                    LOG.debug("finished checking notifier {} for inactive devices",notifier);
+                    LOG.debug("finished checking notifier {} for inactive devices",providerAdapter.getNotifier());
                 }
             } catch (Exception e) {
                 LOG.error("checkForInactiveDevices", e); // not

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/InactiveDeviceManager.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/InactiveDeviceManager.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/InactiveDeviceManager.java
index ecee485..c54a595 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/InactiveDeviceManager.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/InactiveDeviceManager.java
@@ -38,13 +38,14 @@ import java.util.Map;
 public class InactiveDeviceManager {
     private static final Logger LOG = LoggerFactory.getLogger(InactiveDeviceManager.class);
     private final Notifier notifier;
+    private EntityManager entityManager;
 
-    public InactiveDeviceManager(Notifier notifier){
+    public InactiveDeviceManager(Notifier notifier,EntityManager entityManager){
         this.notifier = notifier;
+        this.entityManager = entityManager;
     }
     public void removeInactiveDevices( Map<String,Date> inactiveDeviceMap  ){
         final String notfierPostFix = ApplicationQueueManager.NOTIFIER_ID_POSTFIX;
-        final EntityManager em = notifier.getEntityManager();
         if (inactiveDeviceMap != null && inactiveDeviceMap.size() > 0) {
             LOG.debug("processing {} inactive devices",  inactiveDeviceMap.size());
             Map<String, Object> clearPushtokenMap = new HashMap<String, Object>( 2);
@@ -57,16 +58,16 @@ public class InactiveDeviceManager {
                     // name
                     Query query = new Query();
                     query.addEqualityFilter(notifier.getName() + notfierPostFix, entry.getKey());
-                    Results results = em.searchCollection(em.getApplication(), "devices", query);
+                    Results results = entityManager.searchCollection(entityManager.getApplication(), "devices", query);
                     for (Entity e : results.getEntities()) {
-                        em.updateProperties(e, clearPushtokenMap);
+                        entityManager.updateProperties(e, clearPushtokenMap);
                     }
                     // uuid
                     query = new Query();
                     query.addEqualityFilter(notifier.getUuid() + notfierPostFix, entry.getKey());
-                    results = em.searchCollection(em.getApplication(),  "devices", query);
+                    results = entityManager.searchCollection(entityManager.getApplication(),  "devices", query);
                     for (Entity e : results.getEntities()) {
-                        em.updateProperties(e, clearPushtokenMap);
+                        entityManager.updateProperties(e, clearPushtokenMap);
                     }
                 }catch (Exception e){
                     LOG.error("failed to remove token",e);

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/NotificationsService.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/NotificationsService.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/NotificationsService.java
index 5420d29..a64704c 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/NotificationsService.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/NotificationsService.java
@@ -72,18 +72,6 @@ public class NotificationsService extends AbstractCollectionService {
                 MESSAGE_PROPERTY_DEVICE_UUID, UUID.class);
     }
 
-    // these 2 can be static, but GCM can't. future: would be nice to get gcm
-    // static as well...
-    public static ProviderAdapter APNS_ADAPTER = new APNsAdapter();
-    public static ProviderAdapter TEST_ADAPTER = new TestAdapter();
-
-    public final Map<String, ProviderAdapter> providerAdapters =
-            new HashMap<String, ProviderAdapter>(3);
-    {
-        providerAdapters.put("apple", APNS_ADAPTER);
-        providerAdapters.put("google", new GCMAdapter());
-        providerAdapters.put("noop", TEST_ADAPTER);
-    }
 
     private ApplicationQueueManager notificationQueueManager;
     private long gracePeriod;
@@ -250,10 +238,6 @@ public class NotificationsService extends AbstractCollectionService {
         return (notification.getStarted() == null);
     }
 
-    public Set<String> getProviders() {
-        return providerAdapters.keySet();
-    }
-
     // validate payloads
     private void validate(EntityRef ref, ServicePayload servicePayload)
             throws Exception {
@@ -278,8 +262,7 @@ public class NotificationsService extends AbstractCollectionService {
                         throw new IllegalArgumentException("notifier \""
                                 + notifierId + "\" not found");
                     }
-                    ProviderAdapter providerAdapter = providerAdapters.get(notifier
-                            .getProvider());
+                    ProviderAdapter providerAdapter = ProviderAdapterFactory.getProviderAdapter(notifier,em);
                     Object payload = entry.getValue();
                     try {
                         return providerAdapter.translatePayload(payload); // validate
@@ -354,10 +337,9 @@ public class NotificationsService extends AbstractCollectionService {
      * failure
      */
     public void testConnection(Notifier notifier) throws Exception {
-        ProviderAdapter providerAdapter = providerAdapters.get(notifier.getProvider());
+        ProviderAdapter providerAdapter = ProviderAdapterFactory.getProviderAdapter(notifier,em);
         if (providerAdapter != null) {
-            notifier.setEntityManager(em);
-            providerAdapter.testConnection(notifier);
+            providerAdapter.testConnection();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/ProviderAdapter.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ProviderAdapter.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ProviderAdapter.java
index 33e921f..8acd006 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ProviderAdapter.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ProviderAdapter.java
@@ -34,10 +34,9 @@ import org.apache.usergrid.services.ServicePayload;
  */
 public interface ProviderAdapter {
 
-    public void testConnection(Notifier notifier) throws ConnectionException;
+    public void testConnection() throws ConnectionException;
 
-    public void sendNotification(String providerId, Notifier notifier,
-                                 Object payload, Notification notification, TaskTracker tracker)
+    public void sendNotification(String providerId,  Object payload, Notification notification, TaskTracker tracker)
             throws Exception;
 
     /**
@@ -46,10 +45,13 @@ public interface ProviderAdapter {
      */
     public void doneSendingNotifications() throws Exception;
 
-    public void removeInactiveDevices(Notifier notifier,
-                                                EntityManager em) throws Exception;
+    public void removeInactiveDevices() throws Exception;
 
     public Object translatePayload(Object payload) throws Exception;
 
     public void validateCreateNotifier(ServicePayload payload) throws Exception;
+
+    public void stop();
+
+    public Notifier getNotifier();
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/ProviderAdapterFactory.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ProviderAdapterFactory.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ProviderAdapterFactory.java
new file mode 100644
index 0000000..a4022c1
--- /dev/null
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ProviderAdapterFactory.java
@@ -0,0 +1,49 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  *  contributor license agreements.  The ASF licenses this file to You
+ *  * 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.  For additional information regarding
+ *  * copyright in this work, please see the NOTICE file in the top level
+ *  * directory of this distribution.
+ *
+ */
+
+package org.apache.usergrid.services.notifications;
+
+import org.apache.usergrid.persistence.EntityManager;
+import org.apache.usergrid.persistence.entities.Notifier;
+import org.apache.usergrid.services.notifications.apns.APNsAdapter;
+import org.apache.usergrid.services.notifications.gcm.GCMAdapter;
+
+import java.util.HashMap;
+
+/**
+ * Classy class class.
+ */
+public class ProviderAdapterFactory {
+    private static final String[] providers =  new String[]{"apple", "google", "noop"};
+   public static ProviderAdapter getProviderAdapter(Notifier notifier, EntityManager entityManager){
+       ProviderAdapter adapter = null;
+       switch(notifier.getProvider().toLowerCase()){
+           case "apple" : adapter = new APNsAdapter(entityManager,notifier); break;
+           case "google" : adapter = new GCMAdapter(entityManager ,notifier); break;
+           case "noop" : adapter = new TestAdapter(notifier); break;
+       }
+       return adapter;
+
+   }
+
+    public static String[] getValidProviders() {
+        return providers;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueListener.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueListener.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueListener.java
index fffc8cd..3c788a9 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueListener.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/QueueListener.java
@@ -18,6 +18,7 @@ package org.apache.usergrid.services.notifications;
 
 import com.codahale.metrics.*;
 import com.codahale.metrics.Timer;
+import com.google.common.cache.*;
 import org.apache.usergrid.corepersistence.CpSetup;
 import org.apache.usergrid.metrics.MetricsFactory;
 
@@ -35,10 +36,7 @@ import org.slf4j.LoggerFactory;
 import rx.Observable;
 import javax.annotation.PostConstruct;
 import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
+import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicInteger;
 
 public class QueueListener  {
@@ -148,7 +146,9 @@ public class QueueListener  {
         QueueManager queueManager = TEST_QUEUE_MANAGER != null ? TEST_QUEUE_MANAGER : queueManagerFactory.getQueueManager(queueScope);
         // run until there are no more active jobs
         long runCount = 0;
-        Map<UUID,ApplicationQueueManager> queueManagerMap = new ConcurrentHashMap<>(); //keep a cache of queuemangers then clear them at an interval
+        //cache to retrieve push manager, cached per notifier, so many notifications will get same push manager
+        LoadingCache<UUID, ApplicationQueueManager> queueManagerMap = getQueueManagerCache(queueManager);
+
         while ( true ) {
             try {
 
@@ -175,20 +175,7 @@ public class QueueListener  {
                     //send each set of app ids together
                     for (Map.Entry<UUID, List<QueueMessage>> entry : messageMap.entrySet()) {
                         UUID applicationId = entry.getKey();
-                        EntityManager entityManager = emf.getEntityManager(applicationId);
-                        ServiceManager serviceManager = smf.getServiceManager(applicationId);
-
                         ApplicationQueueManager manager = queueManagerMap.get(applicationId);
-                        if(manager==null) {
-                            manager = new ApplicationQueueManager(
-                                    new JobScheduler(serviceManager, entityManager),
-                                    entityManager,
-                                    queueManager,
-                                    metricsService,
-                                    properties
-                            );
-                            queueManagerMap.put(applicationId,manager);
-                        }
                         LOG.info("send batch for app {} of {} messages", entry.getKey(), entry.getValue().size());
                         Observable current = manager.sendBatchToProviders(entry.getValue(),queueName);
                         if(merge == null)
@@ -210,7 +197,7 @@ public class QueueListener  {
                         Thread.sleep(sleepBetweenRuns);
                     }
                     if(++runCount % consecutiveCallsToRemoveDevices == 0){
-                        for(ApplicationQueueManager applicationQueueManager : queueManagerMap.values()){
+                        for(ApplicationQueueManager applicationQueueManager : queueManagerMap.asMap().values()){
                             try {
                                 applicationQueueManager.asyncCheckForInactiveDevices();
                             }catch (Exception inactiveDeviceException){
@@ -218,7 +205,6 @@ public class QueueListener  {
                             }
                         }
                         //clear everything
-                        queueManagerMap.clear();
                         runCount=0;
                     }
                 }
@@ -244,6 +230,43 @@ public class QueueListener  {
         }
     }
 
+    private LoadingCache<UUID, ApplicationQueueManager> getQueueManagerCache(final QueueManager queueManager) {
+        return CacheBuilder
+                    .newBuilder()
+                    .expireAfterAccess(10, TimeUnit.MINUTES)
+                    .removalListener(new RemovalListener<UUID, ApplicationQueueManager>() {
+                        @Override
+                        public void onRemoval(
+                                RemovalNotification<UUID, ApplicationQueueManager> queueManagerNotifiication) {
+                            try {
+                                queueManagerNotifiication.getValue().stop();
+                            } catch (Exception ie) {
+                                LOG.error("Failed to shutdown from cache", ie);
+                            }
+                        }
+                    }).build(new CacheLoader<UUID, ApplicationQueueManager>() {
+                         @Override
+                         public ApplicationQueueManager load(final UUID applicationId) {
+                             try {
+                                 EntityManager entityManager = emf.getEntityManager(applicationId);
+                                 ServiceManager serviceManager = smf.getServiceManager(applicationId);
+
+                                 ApplicationQueueManager manager = new ApplicationQueueManager(
+                                         new JobScheduler(serviceManager, entityManager),
+                                         entityManager,
+                                         queueManager,
+                                         metricsService,
+                                         properties
+                                 );
+                                 return manager;
+                             } catch (Exception e) {
+                                 LOG.error("Could not instantiate queue manager", e);
+                                 return null;
+                             }
+                         }
+                     });
+    }
+
     public void stop(){
         LOG.info("stop processes");
 
@@ -263,4 +286,6 @@ public class QueueListener  {
     }
     public int getBatchSize(){return batchSize;}
 
+
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/TestAdapter.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/TestAdapter.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/TestAdapter.java
index b4eb767..1007dc6 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/TestAdapter.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/TestAdapter.java
@@ -38,25 +38,26 @@ public class TestAdapter implements ProviderAdapter {
 
     private static final Logger log = LoggerFactory.getLogger(TestAdapter.class);
     private static final int DELAY = 1; // if delay > 0, uses threadpool
+    private final Notifier notifier;
 
     private ExecutorService pool = null;
 
-    public TestAdapter() {
+    public TestAdapter(Notifier notifier) {
         if (DELAY > 0) {
             pool = Executors
                     .newFixedThreadPool(APNsAdapter.MAX_CONNECTION_POOL_SIZE);
         }
+        this.notifier = notifier;
     }
 
     @Override
-    public void testConnection(Notifier notifier) throws ConnectionException {
+    public void testConnection() throws ConnectionException {
     }
 
     @Override
     public void sendNotification(
             String providerId, 
-            Notifier notifier,
-            final Object payload, 
+            final Object payload,
             Notification notification,
             TaskTracker tracker)
             throws Exception {
@@ -89,7 +90,7 @@ public class TestAdapter implements ProviderAdapter {
     }
 
     @Override
-    public void removeInactiveDevices(Notifier notifier, EntityManager em) throws Exception {
+    public void removeInactiveDevices() throws Exception {
         log.debug("getInactiveDevices()");
     }
 
@@ -101,4 +102,14 @@ public class TestAdapter implements ProviderAdapter {
     @Override
     public void validateCreateNotifier(ServicePayload payload) throws Exception {
     }
+
+    @Override
+    public void stop() {
+
+    }
+
+    @Override
+    public Notifier getNotifier() {
+        return notifier;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/APNsAdapter.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/APNsAdapter.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/APNsAdapter.java
index 7ab1dc3..da5d3e5 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/APNsAdapter.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/APNsAdapter.java
@@ -60,13 +60,18 @@ public class APNsAdapter implements ProviderAdapter {
         validEnvironments.add("mock");
     }
 
-    public APNsAdapter(){}
+    private final Notifier notifier;
+
+    private EntityManager entityManager;
+    private EntityPushManager pushManager;
+
+    public APNsAdapter(EntityManager entityManager, Notifier notifier){
+        this.entityManager = entityManager;
+        this.notifier = notifier;
+    }
 
     @Override
-    public void testConnection(Notifier notifier) throws ConnectionException {
-        if(isMock(notifier)){
-            delayRandom(notifier); return;
-        }
+    public void testConnection() throws ConnectionException {
         TestAPNsNotification notification =  TestAPNsNotification.create(TEST_TOKEN, TEST_PAYLOAD);
         try {
             CountDownLatch latch = new CountDownLatch(1);
@@ -99,8 +104,7 @@ public class APNsAdapter implements ProviderAdapter {
     }
 
     @Override
-    public void sendNotification(String providerId, Notifier notifier,
-            Object payload, Notification notification, TaskTracker tracker)
+    public void sendNotification(String providerId, Object payload, Notification notification, TaskTracker tracker)
             throws Exception {
         APNsNotification apnsNotification = APNsNotification.create(providerId, payload.toString(), notification, tracker);
         PushManager<SimpleApnsPushNotification> pushManager = getPushManager(notifier);
@@ -119,74 +123,35 @@ public class APNsAdapter implements ProviderAdapter {
     }
 
     @Override
-    public void removeInactiveDevices(Notifier notifier,EntityManager em) throws Exception {
+    public void removeInactiveDevices() throws Exception {
         PushManager<SimpleApnsPushNotification> pushManager = getPushManager(notifier);
         pushManager.requestExpiredTokens();
     }
 
     private EntityPushManager getPushManager(Notifier notifier) throws ExecutionException {
-        EntityPushManager pushManager = apnsServiceMap.get(notifier);
         if(pushManager != null &&  !pushManager.isStarted() && pushManager.isShutDown()){
-            apnsServiceMap.invalidate(notifier);
-            pushManager = apnsServiceMap.get(notifier);
+            PushManagerConfiguration config = new PushManagerConfiguration();
+            config.setConcurrentConnectionCount(Runtime.getRuntime().availableProcessors() * 2);
+            EntityPushManager pushManager =  new EntityPushManager(notifier,entityManager, config);
+            //only tested when a message is sent
+            pushManager.registerRejectedNotificationListener(new RejectedAPNsListener());
+            //this will get tested when start is called
+            pushManager.registerFailedConnectionListener(new FailedConnectionListener());
+            //unregistered expired devices
+            pushManager.registerExpiredTokenListener(new ExpiredTokenListener());
+
+            try {
+                if (!pushManager.isStarted()) { //ensure manager is started
+                    pushManager.start();
+                }
+            }catch(IllegalStateException ise){
+                logger.debug("failed to start",ise);//could have failed because its started
+            }
+            return pushManager;
         }
         return pushManager;
     }
 
-    //cache to retrieve push manager, cached per notifier, so many notifications will get same push manager
-    private static LoadingCache<Notifier, EntityPushManager> apnsServiceMap = CacheBuilder
-            .newBuilder()
-            .expireAfterAccess(10, TimeUnit.MINUTES)
-            .removalListener(new RemovalListener<Notifier, EntityPushManager>() {
-                @Override
-                public void onRemoval(
-                        RemovalNotification<Notifier,EntityPushManager> notification) {
-                    try {
-                        EntityPushManager manager = notification.getValue();
-                        if (!manager.isShutDown()) {
-                            List<SimpleApnsPushNotification> notifications = manager.shutdown(3000);
-                            for (SimpleApnsPushNotification notification1 : notifications) {
-                                try {
-                                    ((APNsNotification) notification1).messageSendFailed(new Exception("Cache Expired: Shutting down sender"));
-                                }catch (Exception e){
-                                    logger.error("Failed to mark notification",e);
-                                }
-                            }
-                        }
-                    } catch (Exception ie) {
-                        logger.error("Failed to shutdown from cache", ie);
-                    }
-                }
-            }).build(new CacheLoader<Notifier, EntityPushManager>() {
-                @Override
-                public EntityPushManager load(final Notifier notifier) {
-                    try {
-                        PushManagerConfiguration config = new PushManagerConfiguration();
-                        config.setConcurrentConnectionCount(Runtime.getRuntime().availableProcessors() * 2);
-                        EntityPushManager pushManager =  new EntityPushManager(notifier, config);
-                        //only tested when a message is sent
-                        pushManager.registerRejectedNotificationListener(new RejectedAPNsListener());
-                        //this will get tested when start is called
-                        pushManager.registerFailedConnectionListener(new FailedConnectionListener());
-                        //unregistered expired devices
-                        pushManager.registerExpiredTokenListener(new ExpiredTokenListener());
-
-                        try {
-                            if (!pushManager.isStarted()) { //ensure manager is started
-                                pushManager.start();
-                            }
-                        }catch(IllegalStateException ise){
-                            logger.debug("failed to start",ise);//could have failed because its started
-                        }
-                        return pushManager;
-                    } catch (Exception e) {
-                        logger.error("Could not instantiate pushmanager", e);
-                        return null;
-                    }
-                }
-            });
-
-
 
     @Override
     public Object translatePayload(Object objPayload) throws Exception {
@@ -220,23 +185,26 @@ public class APNsAdapter implements ProviderAdapter {
                     "p12Certificate");
         }
     }
-    public boolean isMock(Notifier notifier){
-        return notifier.getEnvironment() !=null ? notifier.getEnvironment().equals("mock") : false ;
-    }
-    public boolean delayRandom(Notifier notifier) {
-        boolean wasDelayed = false;
-        if (isMock(notifier)) {
+
+    @Override
+    public void stop(){
             try {
-                Thread.sleep(
-                        new Random().nextInt(300)
-                );
-                wasDelayed = true;
-            } catch (InterruptedException ie) {
-                //delay was stopped
+                if (!pushManager.isShutDown()) {
+                    List<SimpleApnsPushNotification> notifications = pushManager.shutdown(3000);
+                    for (SimpleApnsPushNotification notification1 : notifications) {
+                        try {
+                            ((APNsNotification) notification1).messageSendFailed(new Exception("Cache Expired: Shutting down sender"));
+                        }catch (Exception e){
+                            logger.error("Failed to mark notification",e);
+                        }
+                    }
+                }
+            } catch (Exception ie) {
+                logger.error("Failed to shutdown from cache", ie);
             }
-        }
-        return wasDelayed;
     }
+    @Override
+    public Notifier getNotifier(){return notifier;}
 
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/EntityPushManager.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/EntityPushManager.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/EntityPushManager.java
index 8283458..d675081 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/EntityPushManager.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/EntityPushManager.java
@@ -38,14 +38,16 @@ import java.util.concurrent.LinkedBlockingDeque;
  */
 public class EntityPushManager extends PushManager<SimpleApnsPushNotification> {
     private final Notifier notifier;
+    private final EntityManager entityManager;
 
-    public EntityPushManager( Notifier notifier, PushManagerConfiguration configuration) {
+    public EntityPushManager( Notifier notifier, EntityManager entityManager, PushManagerConfiguration configuration) {
         super(getApnsEnvironment(notifier), getSSLContext(notifier), null, null, new LinkedBlockingDeque<SimpleApnsPushNotification>(), configuration, notifier.getName());
         this.notifier = notifier;
+        this.entityManager = entityManager;
     }
 
     public EntityManager getEntityManager() {
-        return notifier.getEntityManager();
+        return entityManager;
     }
 
     public Notifier getNotifier() {

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/ExpiredTokenListener.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/ExpiredTokenListener.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/ExpiredTokenListener.java
index 3daa20c..6408dfd 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/ExpiredTokenListener.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/apns/ExpiredTokenListener.java
@@ -53,7 +53,7 @@ public class ExpiredTokenListener implements com.relayrides.pushy.apns.ExpiredTo
         }
         if(pushManager instanceof EntityPushManager){
             EntityPushManager entityPushManager = (EntityPushManager) pushManager;
-            InactiveDeviceManager inactiveDeviceManager = new InactiveDeviceManager(entityPushManager.getNotifier());
+            InactiveDeviceManager inactiveDeviceManager = new InactiveDeviceManager(entityPushManager.getNotifier(),entityPushManager.getEntityManager());
             inactiveDeviceManager.removeInactiveDevices(inactiveDeviceMap);
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifications/gcm/GCMAdapter.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/gcm/GCMAdapter.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/gcm/GCMAdapter.java
index f8de5ff..b65b25a 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/gcm/GCMAdapter.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/gcm/GCMAdapter.java
@@ -40,11 +40,17 @@ public class GCMAdapter implements ProviderAdapter {
     private static final Logger LOG = LoggerFactory.getLogger(GCMAdapter.class);
     private static final int SEND_RETRIES = 3;
     private static int BATCH_SIZE = 1000;
+    private final Notifier notifier;
+    private EntityManager entityManager;
 
     private Map<Notifier, Batch> notifierBatches = new HashMap<Notifier, Batch>();
 
+    public GCMAdapter(EntityManager entityManager,Notifier notifier){
+        this.notifier = notifier;
+        this.entityManager = entityManager;
+    }
     @Override
-    public void testConnection(Notifier notifier) throws ConnectionException {
+    public void testConnection() throws ConnectionException {
         Sender sender = new Sender(notifier.getApiKey());
         Message message = new Message.Builder().build();
         try {
@@ -56,7 +62,7 @@ public class GCMAdapter implements ProviderAdapter {
     }
 
     @Override
-    public void sendNotification(String providerId, Notifier notifier,
+    public void sendNotification(String providerId,
             Object payload, Notification notification, TaskTracker tracker)
             throws Exception {
         Map<String,Object> map = (Map<String, Object>) payload;
@@ -66,12 +72,11 @@ public class GCMAdapter implements ProviderAdapter {
             expireSeconds = expireSeconds <= 2419200 ? expireSeconds : 2419200; //send the max gcm value documented here http://developer.android.com/google/gcm/adv.html#ttl
             map.put(expiresKey, expireSeconds);
         }
-        Batch batch = getBatch(notifier, map);
+        Batch batch = getBatch( map);
         batch.add(providerId, tracker);
     }
 
-    synchronized private Batch getBatch(Notifier notifier,
-            Map<String, Object> payload) {
+    synchronized private Batch getBatch( Map<String, Object> payload) {
         Batch batch = notifierBatches.get(notifier);
         if (batch == null && payload != null) {
             batch = new Batch(notifier, payload);
@@ -88,13 +93,12 @@ public class GCMAdapter implements ProviderAdapter {
     }
 
     @Override
-    public void removeInactiveDevices(Notifier notifier,
-            EntityManager em) throws Exception {
-        Batch batch = getBatch(notifier, null);
+    public void removeInactiveDevices( ) throws Exception {
+        Batch batch = getBatch( null);
         Map<String,Date> map = null;
         if(batch != null) {
             map = batch.getAndClearInactiveDevices();
-            InactiveDeviceManager deviceManager = new InactiveDeviceManager(notifier);
+            InactiveDeviceManager deviceManager = new InactiveDeviceManager(notifier,entityManager);
             deviceManager.removeInactiveDevices(map);
         }
 
@@ -126,6 +130,16 @@ public class GCMAdapter implements ProviderAdapter {
         }
     }
 
+    @Override
+    public void stop() {
+
+    }
+
+    @Override
+    public Notifier getNotifier() {
+        return notifier;
+    }
+
     private class Batch {
         private Notifier notifier;
         private Map payload;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/main/java/org/apache/usergrid/services/notifiers/NotifiersService.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifiers/NotifiersService.java b/stack/services/src/main/java/org/apache/usergrid/services/notifiers/NotifiersService.java
index 8c41e0a..ae089fe 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifiers/NotifiersService.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifiers/NotifiersService.java
@@ -18,6 +18,10 @@ package org.apache.usergrid.services.notifiers;
 
 import org.apache.usergrid.persistence.Entity;
 import org.apache.usergrid.persistence.entities.Notifier;
+import org.apache.usergrid.services.notifications.ProviderAdapterFactory;
+import org.apache.usergrid.services.notifications.TestAdapter;
+import org.apache.usergrid.services.notifications.apns.APNsAdapter;
+import org.apache.usergrid.services.notifications.gcm.GCMAdapter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.usergrid.services.*;
@@ -25,6 +29,8 @@ import org.apache.usergrid.services.notifications.NotificationsService;
 import org.apache.usergrid.services.notifications.ProviderAdapter;
 
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 
 public class NotifiersService extends AbstractCollectionService {
@@ -45,22 +51,21 @@ public class NotifiersService extends AbstractCollectionService {
 
         NotificationsService ns = (NotificationsService) sm
                 .getService("notifications");
-        Set<String> providers = ns.getProviders();
 
         String provider = payload.getStringProperty("provider");
-        if (!providers.contains(provider)) {
-            throw new IllegalArgumentException("provider must be one of: "
-                    + Arrays.toString(providers.toArray()));
-        }
 
-        ProviderAdapter providerAdapter = ns.providerAdapters.get(provider);
-        providerAdapter.validateCreateNotifier(payload);
 
         ServiceResults results = super.postCollection(context);
-
-        Notifier notifier =(Notifier) results.getEntity();
+        Notifier notifier = (Notifier) results.getEntity();
         if (notifier != null) {
             try {
+                ProviderAdapter providerAdapter = ProviderAdapterFactory.getProviderAdapter(notifier, em);
+
+                if (providerAdapter==null) {
+                    throw new IllegalArgumentException("provider must be one of: "
+                            + Arrays.toString(ProviderAdapterFactory.getValidProviders()));
+                }
+                providerAdapter.validateCreateNotifier(payload);
                 ns.testConnection(notifier);
             } catch (Exception e) {
                 logger.info("notifier testConnection() failed", e);

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/test/java/org/apache/usergrid/services/notifications/NotifiersServiceIT.java
----------------------------------------------------------------------
diff --git a/stack/services/src/test/java/org/apache/usergrid/services/notifications/NotifiersServiceIT.java b/stack/services/src/test/java/org/apache/usergrid/services/notifications/NotifiersServiceIT.java
index 61cf1e6..7ced70c 100644
--- a/stack/services/src/test/java/org/apache/usergrid/services/notifications/NotifiersServiceIT.java
+++ b/stack/services/src/test/java/org/apache/usergrid/services/notifications/NotifiersServiceIT.java
@@ -44,7 +44,6 @@ public class NotifiersServiceIT extends AbstractServiceIT {
     @Before
     public void before() throws Exception {
         ns = (NotificationsService) app.getSm().getService("notifications");
-        MockSuccessfulProviderAdapter.install(ns);
     }
 
     @Test
@@ -76,16 +75,6 @@ public class NotifiersServiceIT extends AbstractServiceIT {
             // ok
         }
 
-        // mock action (based on verified actual behavior) //
-        ns.providerAdapters
-                .put("google",
-                        new org.apache.usergrid.services.notifications.gcm.MockSuccessfulProviderAdapter() {
-                            @Override
-                            public void testConnection(Notifier notifier)
-                                    throws ConnectionException {
-                                throw new ConnectionException("", null);
-                            }
-                        });
 
         app.put("apiKey", "xxx");
 
@@ -100,8 +89,6 @@ public class NotifiersServiceIT extends AbstractServiceIT {
     @Test
     public void badAPNsEnvironment() throws Exception {
 
-        MockSuccessfulProviderAdapter.uninstall(ns);
-
         app.clear();
         app.put("provider", "apple");
         app.put("environment", "xxx");
@@ -141,16 +128,7 @@ public class NotifiersServiceIT extends AbstractServiceIT {
     @Test
     public void badAPNsCertificate() throws Exception {
 
-        // mock error (based on verified actual behavior) //
-        ns.providerAdapters.put("apple", new MockSuccessfulProviderAdapter() {
-            @Override
-            public void testConnection(Notifier notifier)
-                    throws ConnectionException {
-                Exception e = new SocketException(
-                        "Connection closed by remote host");
-                throw new ConnectionException(e.getMessage(), e);
-            }
-        });
+
 
         app.clear();
         app.put("provider", "apple");
@@ -174,15 +152,6 @@ public class NotifiersServiceIT extends AbstractServiceIT {
     @Test
     public void badAPNsPassword() throws Exception {
 
-        // mock error (based on verified actual behavior) //
-        ns.providerAdapters.put("apple", new MockSuccessfulProviderAdapter() {
-            @Override
-            public void testConnection(Notifier notifier)
-                    throws ConnectionException {
-                Exception e = new Exception("invalid ssl config");
-                throw new ConnectionException(e.getMessage(), e);
-            }
-        });
 
         app.clear();
         app.put("provider", "apple");

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/test/java/org/apache/usergrid/services/notifications/apns/MockSuccessfulProviderAdapter.java
----------------------------------------------------------------------
diff --git a/stack/services/src/test/java/org/apache/usergrid/services/notifications/apns/MockSuccessfulProviderAdapter.java b/stack/services/src/test/java/org/apache/usergrid/services/notifications/apns/MockSuccessfulProviderAdapter.java
index e864e4f..b3096b7 100644
--- a/stack/services/src/test/java/org/apache/usergrid/services/notifications/apns/MockSuccessfulProviderAdapter.java
+++ b/stack/services/src/test/java/org/apache/usergrid/services/notifications/apns/MockSuccessfulProviderAdapter.java
@@ -23,34 +23,15 @@ import org.apache.usergrid.services.notifications.NotificationsService;
 import org.apache.usergrid.services.notifications.ProviderAdapter;
 import org.apache.usergrid.services.notifications.TaskTracker;
 
-import java.util.Date;
-import java.util.Map;
 import java.util.Random;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import org.apache.usergrid.persistence.EntityManager;
 import org.apache.usergrid.services.ServicePayload;
 
 public class MockSuccessfulProviderAdapter implements ProviderAdapter {
 
     private static ProviderAdapter realProviderAdapter;
 
-    public static void install(NotificationsService ns) {
-        install(ns, false);
-    }
-
-    public static void install(NotificationsService ns, boolean doAsync) {
-        if (realProviderAdapter != null)
-            realProviderAdapter = ns.providerAdapters.get("apple");
-        ns.providerAdapters.put("apple", new MockSuccessfulProviderAdapter(
-                doAsync));
-    }
-
-    public static void uninstall(NotificationsService ns) {
-        if (realProviderAdapter != null) {
-            ns.providerAdapters.put("apple", realProviderAdapter);
-        }
-    }
 
     private ExecutorService pool;
 
@@ -65,7 +46,7 @@ public class MockSuccessfulProviderAdapter implements ProviderAdapter {
     }
 
     @Override
-    public void testConnection(Notifier notifier) throws ConnectionException {
+    public void testConnection() throws ConnectionException {
     }
 
     @Override
@@ -74,8 +55,7 @@ public class MockSuccessfulProviderAdapter implements ProviderAdapter {
     }
 
     @Override
-    public void removeInactiveDevices(Notifier notifier,
-            EntityManager em) {
+    public void removeInactiveDevices() {
     }
 
     @Override
@@ -83,12 +63,21 @@ public class MockSuccessfulProviderAdapter implements ProviderAdapter {
     }
 
     @Override
+    public void stop() {
+
+    }
+
+    @Override
+    public Notifier getNotifier() {
+        return null;
+    }
+
+    @Override
     public void doneSendingNotifications() throws Exception {
     }
 
     @Override
-    public void sendNotification(final String providerId,
-            final Notifier notifier, final Object payload,
+    public void sendNotification(final String providerId, final Object payload,
             final Notification notification, final TaskTracker tracker)
             throws Exception {
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/test/java/org/apache/usergrid/services/notifications/apns/NotificationsServiceIT.java
----------------------------------------------------------------------
diff --git a/stack/services/src/test/java/org/apache/usergrid/services/notifications/apns/NotificationsServiceIT.java b/stack/services/src/test/java/org/apache/usergrid/services/notifications/apns/NotificationsServiceIT.java
index 31a653c..2a4ec73 100644
--- a/stack/services/src/test/java/org/apache/usergrid/services/notifications/apns/NotificationsServiceIT.java
+++ b/stack/services/src/test/java/org/apache/usergrid/services/notifications/apns/NotificationsServiceIT.java
@@ -327,8 +327,6 @@ public class NotificationsServiceIT extends AbstractServiceNotificationIT {
     @Test
     public void badPayloads() throws Exception {
 
-        MockSuccessfulProviderAdapter.uninstall(ns);
-
         // bad payloads format
 
         app.clear();
@@ -400,24 +398,6 @@ public class NotificationsServiceIT extends AbstractServiceNotificationIT {
 
         // mock action (based on verified actual behavior) //
 
-        if (!USE_REAL_CONNECTIONS) {
-            ns.providerAdapters.put("apple",
-                    new MockSuccessfulProviderAdapter() {
-                        @Override
-                        public void sendNotification(String providerId,
-                                                     Notifier notifier, Object payload,
-                                                     Notification notification, TaskTracker tracker)
-                                throws Exception {
-                            APNsNotification apnsNotification = APNsNotification
-                                    .create(providerId, payload.toString(),
-                                            notification, tracker);
-                            apnsNotification.messageSent();
-                            apnsNotification
-                                    .messageSendFailed( RejectedNotificationReason.INVALID_TOKEN);
-                        }
-                    });
-        }
-
         // create push notification //
 
         HashMap<String, Object> properties = new LinkedHashMap<String, Object>();
@@ -628,16 +608,16 @@ public class NotificationsServiceIT extends AbstractServiceNotificationIT {
 
         // mock error (based on verified actual behavior) //
         if (!USE_REAL_CONNECTIONS) {
-            ns.providerAdapters.put("apple",
-                    new MockSuccessfulProviderAdapter() {
-                        @Override
-                        public void testConnection(Notifier notifier)
-                                throws ConnectionException {
-                            Exception e = new SocketException(
-                                    "Connection closed by remote host");
-                            throw new ConnectionException(e.getMessage(), e);
-                        }
-                    });
+//            ns.providerAdapters.put("apple",
+//                    new MockSuccessfulProviderAdapter() {
+//                        @Override
+//                        public void testConnection(Notifier notifier)
+//                                throws ConnectionException {
+//                            Exception e = new SocketException(
+//                                    "Connection closed by remote host");
+//                            throw new ConnectionException(e.getMessage(), e);
+//                        }
+//                    });
         }
 
         // create push notification //
@@ -685,8 +665,7 @@ public class NotificationsServiceIT extends AbstractServiceNotificationIT {
 
         // mock action (based on verified actual behavior) //
         if (!USE_REAL_CONNECTIONS) {
-            ns.providerAdapters.put("apple",
-                    new MockSuccessfulProviderAdapter());
+
         }
 
         // create push notification //

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/MockSuccessfulProviderAdapter.java
----------------------------------------------------------------------
diff --git a/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/MockSuccessfulProviderAdapter.java b/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/MockSuccessfulProviderAdapter.java
index 3836fe8..c41e5ab 100644
--- a/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/MockSuccessfulProviderAdapter.java
+++ b/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/MockSuccessfulProviderAdapter.java
@@ -32,23 +32,13 @@ public class MockSuccessfulProviderAdapter implements ProviderAdapter {
 
     private static ProviderAdapter realProviderAdapter;
 
-    public static void install(NotificationsService ns) {
-        if (realProviderAdapter != null)
-            realProviderAdapter = ns.providerAdapters.get("google");
-        ns.providerAdapters.put("google", new MockSuccessfulProviderAdapter());
-    }
 
-    public static void uninstall(NotificationsService ns) {
-        if (realProviderAdapter != null) {
-            ns.providerAdapters.put("google", realProviderAdapter);
-        }
-    }
 
     public MockSuccessfulProviderAdapter() {
     }
 
     @Override
-    public void testConnection(Notifier notifier) throws ConnectionException {
+    public void testConnection() throws ConnectionException {
     }
 
     @Override
@@ -56,14 +46,20 @@ public class MockSuccessfulProviderAdapter implements ProviderAdapter {
         return payload.toString();
     }
 
+
+
     @Override
-    public void removeInactiveDevices(Notifier notifier,
-            EntityManager em) throws Exception {
+    public void validateCreateNotifier(ServicePayload payload) throws Exception {
+    }
+
+    @Override
+    public void stop() {
 
     }
 
     @Override
-    public void validateCreateNotifier(ServicePayload payload) throws Exception {
+    public Notifier getNotifier() {
+        return null;
     }
 
     @Override
@@ -71,7 +67,12 @@ public class MockSuccessfulProviderAdapter implements ProviderAdapter {
     }
 
     @Override
-    public void sendNotification(String providerId, Notifier notifier,
+    public void removeInactiveDevices() throws Exception {
+
+    }
+
+    @Override
+    public void sendNotification(String providerId,
             Object payload, Notification notification, final TaskTracker tracker)
             throws Exception {
         new Thread() {

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/0f4584c4/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/NotificationsServiceIT.java
----------------------------------------------------------------------
diff --git a/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/NotificationsServiceIT.java b/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/NotificationsServiceIT.java
index ea0b7da..3795be1 100644
--- a/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/NotificationsServiceIT.java
+++ b/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/NotificationsServiceIT.java
@@ -240,51 +240,6 @@ public class NotificationsServiceIT extends AbstractServiceNotificationIT {
         }
     }
 
-    @Ignore("todo: how can I mock this?")
-    @Test
-    public void providerIdUpdate() throws Exception {
-
-        // mock action (based on verified actual behavior) //
-        final String newProviderId = "newProviderId";
-        ns.providerAdapters.put("google", new MockSuccessfulProviderAdapter() {
-            @Override
-            public void sendNotification(String providerId, Notifier notifier,
-                                         Object payload, Notification notification,
-                                         TaskTracker tracker) throws Exception {
-                tracker.completed(newProviderId);
-            }
-        });
-
-        // create push notification //
-
-        app.clear();
-        String payload = "Hello, World!";
-        Map<String, String> payloads = new HashMap<String, String>(1);
-        payloads.put(notifier.getUuid().toString(), payload);
-        app.put("payloads", payloads);
-        app.put("queued", System.currentTimeMillis());
-        app.put("debug",true);
-
-        Entity e = app.testRequest(ServiceAction.POST, 1,"devices",device1.getUuid(), "notifications")
-                .getEntity();
-        app.testRequest(ServiceAction.GET, 1, "notifications", e.getUuid());
-
-        Notification notification = app.getEm().get(e.getUuid(),
-                Notification.class);
-        assertEquals(
-                notification.getPayloads().get(notifier.getUuid().toString()),
-                payload);
-
-        ns.addDevice(notification, device1);
-
-        // perform push //
-        notification = scheduleNotificationAndWait(notification);
-        checkReceipts(notification, 1);
-
-        Device device = (Device) app.getEm().get(device1).toTypedEntity();
-        assertEquals(newProviderId,
-                device.getProperty(notifier.getName() + NOTIFIER_ID_POSTFIX));
-    }
 
     @Test
     public void badPayloads() throws Exception {
@@ -353,20 +308,6 @@ public class NotificationsServiceIT extends AbstractServiceNotificationIT {
     @Test
     public void badToken() throws Exception {
 
-        // mock action (based on verified actual behavior) //
-        if (!USE_REAL_CONNECTIONS) {
-            ns.providerAdapters.put("google",
-                    new MockSuccessfulProviderAdapter() {
-                        @Override
-                        public void sendNotification(String providerId,
-                                                     Notifier notifier, Object payload,
-                                                     Notification notification, TaskTracker tracker)
-                                throws Exception {
-                            tracker.failed("InvalidRegistration",
-                                    "InvalidRegistration");
-                        }
-                    });
-        }
 
         // create push notification //
 
@@ -410,21 +351,6 @@ public class NotificationsServiceIT extends AbstractServiceNotificationIT {
     @Test
     public void badAPIKey() throws Exception {
 
-        if (!USE_REAL_CONNECTIONS) {
-            // mock action (based on verified actual behavior) //
-            ns.providerAdapters.put("google",
-                    new MockSuccessfulProviderAdapter() {
-                        @Override
-                        public void sendNotification(String providerId,
-                                                     Notifier notifier, Object payload,
-                                                     Notification notification, TaskTracker tracker)
-                                throws Exception {
-                            Exception e = new IOException();
-                            throw new ConnectionException(e.getMessage(), e);
-                        }
-                    });
-        }
-
         // create push notification //
 
         app.clear();