private void createEventsForObserver(Vector<TSEvent> _eventList, boolean snapshot) {
    String tsEventLog = null;
    if (_eventList == null) return;
    int cause;
    int metaCode;
    if (snapshot) {
      metaCode = 135;
      cause = 110;
    } else {
      metaCode = 136;
      cause = 100;
    }

    int nextMetaEventIndex = this.eventList.size();

    TSEvent ev = null;
    Object tsTarget = null;
    TSDevice target = null;
    TSAgent agent = null;
    Object privateData = null;
    log.debug(
        "meta event BEGIN: cause ("
            + cause
            + ") metaCode ("
            + metaCode
            + ")"
            + " for "
            + this.observer);
    for (int i = 0; i < _eventList.size(); i++) {
      ev = (TSEvent) _eventList.elementAt(i);
      tsTarget = ev.getEventTarget();
      if ((tsTarget instanceof TSDevice)) {
        target = (TSDevice) tsTarget;
      } else if ((tsTarget instanceof TSAgent)) {
        agent = (TSAgent) tsTarget;
        target = agent.getTSACDDevice();
        if (target == null) {
          target = ev.getSkillDevice();
        }
      }
      privateData = ev.getPrivateData();

      switch (ev.getEventType()) {
        case 37:
          tsEventLog = "ADDRESSDONOTDISTURBEVENT for " + target;

          addEvent(
              new TsapiAddressDNDEvent(
                  createAddress(target), target.dndState, cause, metaCode, privateData),
              tsEventLog);

          break;
        case 38:
          tsEventLog = "ADDRESSMESSAGEWAITINGEVENT for " + target;

          if (this.provider.isLucent()) {
            addEvent(
                new LucentAddressMsgWaitingEventImpl(
                    createAddress(target), target.msgWaitingBits, cause, metaCode, privateData),
                tsEventLog);
          } else {
            addEvent(
                new TsapiAddressMsgWaitingEvent(
                    createAddress(target), target.msgWaitingBits, cause, metaCode, privateData),
                tsEventLog);
          }

          break;
        case 39:
          tsEventLog = "ADDRESSFORWARDEVENT for " + target;

          addEvent(
              new TsapiAddressForwardEvent(
                  createAddress(target), target.createForwarding(), cause, metaCode, privateData),
              tsEventLog);

          break;
        case 40:
          tsEventLog = "ADDRESSLOGGEDONEVENT for " + agent;

          addEvent(
              new TsapiAddrLogOnEv(
                  createAddress(target), createAgent(agent), cause, metaCode, privateData),
              tsEventLog);

          break;
        case 41:
          tsEventLog = "ADDRESSLOGGEDOFFEVENT for " + agent;

          addEvent(
              new TsapiAddrLogOffEv(
                  createAddress(target), createAgent(agent), cause, metaCode, privateData),
              tsEventLog);

          break;
        case 42:
          tsEventLog = "ADDRESSREADYEVENT for " + agent;

          addEvent(
              new TsapiAddrReadyEv(
                  createAddress(target), createAgent(agent), cause, metaCode, privateData),
              tsEventLog);

          break;
        case 43:
          tsEventLog = "ADDRESSNOTREADYEVENT for " + agent;

          addEvent(
              new TsapiAddrNotReadyEv(
                  createAddress(target), createAgent(agent), cause, metaCode, privateData),
              tsEventLog);

          break;
        case 44:
          tsEventLog = "ADDRESSWORKREADYEVENT for " + agent;

          addEvent(
              new TsapiAddrWorkReadyEv(
                  createAddress(target), createAgent(agent), cause, metaCode, privateData),
              tsEventLog);

          break;
        case 45:
          tsEventLog = "ADDRESSWORKNOTREADYEVENT for " + agent;

          addEvent(
              new TsapiAddrWorkNotReadyEv(
                  createAddress(target), createAgent(agent), cause, metaCode, privateData),
              tsEventLog);

          break;
        case 46:
          tsEventLog = "ADDRESSBUSYEVENT for " + agent;

          addEvent(
              new TsapiAddrBusyEv(
                  createAddress(target), createAgent(agent), cause, metaCode, privateData),
              tsEventLog);

          break;
        case 9999:
          tsEventLog = "PRIVATEEVENT for " + target;

          addEvent(
              new TsapiPrivateAddressEvent(createAddress(target), cause, metaCode, privateData),
              tsEventLog);
      }
    }

    synchronized (this.eventList) {
      log.debug("meta event END for " + this.observer + " eventList size=" + this.eventList.size());

      if (this.eventList.size() == 0) {
        log.debug("no events to send to " + this.observer);
        return;
      }

      if (nextMetaEventIndex < this.eventList.size()) {
        ((TsapiObserverEvent) this.eventList.elementAt(nextMetaEventIndex)).setNewMetaEventFlag();
      }
    }
    JtapiEventThreadManager.execute(this);
  }
  private void createEventsForListener(Vector<TSEvent> _eventList, boolean snapshot) {
    if (_eventList == null) return;
    int cause;
    if (snapshot) {
      cause = 110;
    } else {
      cause = 100;
    }

    TSEvent tsEvent = null;
    Object tsTarget = null;
    TSDevice target = null;
    TSAgent targetAgent = null;
    Object privateData = null;
    Object previousPrivateData = null;
    Address address = null;
    Agent agent = null;
    Object source = null;
    for (int i = 0; i < _eventList.size(); i++) {
      tsEvent = (TSEvent) _eventList.elementAt(i);
      tsTarget = tsEvent.getEventTarget();
      if ((tsTarget instanceof TSDevice)) {
        target = (TSDevice) tsTarget;
        address = createAddress(target);
        source = address;
      } else if ((tsTarget instanceof TSAgent)) {
        targetAgent = (TSAgent) tsTarget;
        agent = createAgent(targetAgent);
        source = agent;
        target = targetAgent.getTSACDDevice();
        if (target == null) target = tsEvent.getSkillDevice();
        address = createAddress(target);
      }
      privateData = tsEvent.getPrivateData();
      if (privateData != null) {
        if ((previousPrivateData != null) && (!privateData.equals(previousPrivateData))) {
          _eventList.add(new TSEvent(9999, tsEvent.getEventTarget(), privateData, this.provider));
          previousPrivateData = privateData;
        }
      } else {
        previousPrivateData = null;
      }
      AddressEventParams addressEventParams = new AddressEventParams();
      addressEventParams.setCause(cause);
      addressEventParams.setPrivateData(privateData);
      String tsEventLog;
      switch (tsEvent.getEventType()) {
        case 37:
          tsEventLog = "ADDRESSDONOTDISTURBEVENT for " + target;
          addressEventParams.setEventId(350);
          addressEventParams.setDoNotDisturbState(target.dndState);
          addressEventParams.setSource(source);
          addCallControlAddressEvents(
              new CallControlAddressEventImpl(addressEventParams, address), tsEventLog);
          break;
        case 38:
          tsEventLog = "ADDRESSMESSAGEWAITINGEVENT for " + target;
          addressEventParams.setSource(source);
          addressEventParams.setEventId(352);
          addressEventParams.setMwBits(target.msgWaitingBits);
          if (this.provider.isLucent()) {
            addCallControlAddressEvents(
                new LucentCallControlAddressMsgWaitingEventImpl(addressEventParams, address),
                tsEventLog);
          } else {
            addCallControlAddressEvents(
                new CallControlAddressEventImpl(addressEventParams, address), tsEventLog);
          }
          break;
        case 39:
          tsEventLog = "ADDRESSFORWARDEVENT for " + target;
          addressEventParams.setSource(source);
          addressEventParams.setEventId(351);
          addressEventParams.setCallControlForwarding(target.createForwarding());
          addCallControlAddressEvents(
              new CallControlAddressEventImpl(addressEventParams, address), tsEventLog);
          break;
        case 40:
          tsEventLog = "ADDRESSLOGGEDONEVENT for " + targetAgent;
          addressEventParams.setEventId(302);
          addressEventParams.setSource(source);
          addCallCenterAddressEvents(
              new ACDAddressEventImpl(addressEventParams, address, agent, privateData), tsEventLog);
          break;
        case 41:
          tsEventLog = "ADDRESSLOGGEDOFFEVENT for " + targetAgent;
          addressEventParams.setEventId(301);
          addressEventParams.setSource(source);
          addCallCenterAddressEvents(
              new ACDAddressEventImpl(addressEventParams, address, agent, privateData), tsEventLog);
          break;
        case 42:
          tsEventLog = "ADDRESSREADYEVENT for " + targetAgent;
          addressEventParams.setEventId(304);
          addressEventParams.setSource(source);
          addCallCenterAddressEvents(
              new ACDAddressEventImpl(addressEventParams, address, agent, privateData), tsEventLog);
          break;
        case 43:
          tsEventLog = "ADDRESSNOTREADYEVENT for " + targetAgent;
          addressEventParams.setEventId(303);
          addressEventParams.setSource(source);
          addCallCenterAddressEvents(
              new ACDAddressEventImpl(addressEventParams, address, agent, privateData), tsEventLog);
          break;
        case 44:
          tsEventLog = "ADDRESSWORKREADYEVENT for " + targetAgent;
          addressEventParams.setEventId(307);
          addressEventParams.setSource(source);
          addCallCenterAddressEvents(
              new ACDAddressEventImpl(addressEventParams, address, agent, privateData), tsEventLog);
          break;
        case 45:
          tsEventLog = "ADDRESSWORKNOTREADYEVENT for " + targetAgent;
          addressEventParams.setEventId(306);
          addressEventParams.setSource(source);
          addCallCenterAddressEvents(
              new ACDAddressEventImpl(addressEventParams, address, agent, privateData), tsEventLog);
          break;
        case 46:
          tsEventLog = "ADDRESSBUSYEVENT for " + targetAgent;
          addressEventParams.setEventId(300);
          addressEventParams.setSource(source);
          addCallCenterAddressEvents(
              new ACDAddressEventImpl(addressEventParams, address, agent, privateData), tsEventLog);
          break;
        case 9999:
          tsEventLog = "PRIVATEEVENT for " + target;
          addPrivateEvents(
              new PrivateDataEventImpl(600, cause, null, source, privateData), tsEventLog);
      }
    }

    if (this.listenerEventList.size() == 0) {
      log.debug("no events to send to " + this.addressListener);
      return;
    }
    JtapiEventThreadManager.execute(this);
  }