public void notifyListeners(InstanceEvent event) {
   if (event.getType() == InstanceEventType.INSTANCE_ABOUT_TO_TRANSITION) {
     fireInstanceAboutToTransition(event);
   } else {
     eventsToFire.add(event);
     synchronized (eventsToFire) {
       eventsToFire.notify();
     }
   }
 }
        public void run() {
          while (InstanceEventManager.this.isListenerAttached()) {
            if (eventsToFire != null) {
              if (eventsToFire.isEmpty()) {
                synchronized (eventsToFire) {
                  try {
                    eventsToFire.wait();
                  } catch (InterruptedException e) {
                  }
                }
              }

              if (!eventsToFire.isEmpty()) {
                InstanceEvent[] array =
                    eventsToFire.toArray(new InstanceEvent[eventsToFire.size()]);
                InstanceEvent e = array[0];
                switch (e.getType()) {
                  case INSTANCE_CREATED:
                    fireInstanceCreated(e);
                    break;
                  case INSTANCE_DELETED:
                    fireInstanceDeleted(e);
                    break;
                  case INSTANCE_LOADED:
                    fireInstanceLoaded(e);
                    break;
                  case INSTANCE_UNLOADED:
                    fireInstanceUnloaded(e);
                    break;
                  case INSTANCE_UPDATED:
                    fireInstanceUpdated(e);
                    break;
                  case INSTANCE_TRANSITIONED:
                    fireInstanceTransitioned(e);
                    break;
                }
                eventsToFire.remove(e);
              }
            }
          }
        }