Search in sources :

Example 1 with LongPollRequest

use of com.serotonin.m2m2.web.dwr.longPoll.LongPollRequest in project ma-core-public by infiniteautomation.

the class BaseDwr method initializeLongPoll.

@DwrPermission(anonymous = true)
public Map<String, Object> initializeLongPoll(int pollSessionId, LongPollRequest request) {
    LongPollData data = getLongPollData(pollSessionId, true);
    data.setRequest(request);
    return doLongPoll(pollSessionId);
}
Also used : LongPollData(com.serotonin.m2m2.web.dwr.longPoll.LongPollData) DwrPermission(com.serotonin.m2m2.web.dwr.util.DwrPermission)

Example 2 with LongPollRequest

use of com.serotonin.m2m2.web.dwr.longPoll.LongPollRequest in project ma-core-public by infiniteautomation.

the class BaseDwr method terminateLongPollImpl.

@DwrPermission(anonymous = true)
public static void terminateLongPollImpl(LongPollData longPollData) {
    LongPollRequest request = longPollData.getRequest();
    if (request == null)
        return;
    request.setTerminated(true);
    notifyLongPollImpl(request);
}
Also used : LongPollRequest(com.serotonin.m2m2.web.dwr.longPoll.LongPollRequest) DwrPermission(com.serotonin.m2m2.web.dwr.util.DwrPermission)

Example 3 with LongPollRequest

use of com.serotonin.m2m2.web.dwr.longPoll.LongPollRequest in project ma-core-public by infiniteautomation.

the class BaseDwr method doLongPoll.

@DwrPermission(anonymous = true)
public Map<String, Object> doLongPoll(int pollSessionId) {
    Map<String, Object> response = new HashMap<>();
    HttpServletRequest httpRequest = WebContextFactory.get().getHttpServletRequest();
    User user = Common.getUser(httpRequest);
    EventDao eventDao = EventDao.instance;
    LongPollData data = getLongPollData(pollSessionId, false);
    data.updateTimestamp();
    LongPollRequest pollRequest = data.getRequest();
    // One minute
    long expireTime = Common.timer.currentTimeMillis() + 60000;
    LongPollState state = data.getState();
    int waitTime = SystemSettingsDao.getIntValue(SystemSettingsDao.UI_PERFORMANCE);
    // For users that log in on multiple machines (or browsers), reset the
    // last alarm timestamp so that it always
    // gets reset with at least each new poll. For now this beats writing
    // user-specific event change tracking code.
    state.setLastAlarmLevelChange(0);
    while (!pollRequest.isTerminated() && Common.timer.currentTimeMillis() < expireTime) {
        if (Providers.get(IMangoLifecycle.class).isTerminated()) {
            pollRequest.setTerminated(true);
            break;
        }
        if (pollRequest.isMaxAlarm() && user != null) {
            // Track the last alarm count to see if we need to update the
            // alarm toaster
            Integer lastUnsilencedAlarmCount = (Integer) data.getState().getAttribute("lastUnsilencedAlarmCount");
            // Ensure we have one, as we won't on first run
            if (lastUnsilencedAlarmCount == null)
                lastUnsilencedAlarmCount = 0;
            // Sort into lists for the different types
            List<EventInstance> events = Common.eventManager.getAllActiveUserEvents(user.getId());
            int currentUnsilencedAlarmCount = events.size();
            int lifeSafetyTotal = 0;
            EventInstance lifeSafetyEvent = null;
            int criticalTotal = 0;
            EventInstance criticalEvent = null;
            int urgentTotal = 0;
            EventInstance urgentEvent = null;
            int warningTotal = 0;
            EventInstance warningEvent = null;
            int importantTotal = 0;
            EventInstance importantEvent = null;
            int informationTotal = 0;
            EventInstance informationEvent = null;
            int noneTotal = 0;
            EventInstance noneEvent = null;
            int doNotLogTotal = 0;
            EventInstance doNotLogEvent = null;
            for (EventInstance event : events) {
                switch(event.getAlarmLevel()) {
                    case AlarmLevels.LIFE_SAFETY:
                        lifeSafetyTotal++;
                        lifeSafetyEvent = event;
                        break;
                    case AlarmLevels.CRITICAL:
                        criticalTotal++;
                        criticalEvent = event;
                        break;
                    case AlarmLevels.URGENT:
                        urgentTotal++;
                        urgentEvent = event;
                        break;
                    case AlarmLevels.WARNING:
                        warningTotal++;
                        warningEvent = event;
                        break;
                    case AlarmLevels.IMPORTANT:
                        importantTotal++;
                        importantEvent = event;
                        break;
                    case AlarmLevels.INFORMATION:
                        informationTotal++;
                        informationEvent = event;
                        break;
                    case AlarmLevels.NONE:
                        noneTotal++;
                        noneEvent = event;
                        break;
                    case AlarmLevels.DO_NOT_LOG:
                        doNotLogTotal++;
                        doNotLogEvent = event;
                        break;
                }
            }
            // If we have some new information we should show it
            if (lastUnsilencedAlarmCount != currentUnsilencedAlarmCount) {
                data.getState().setAttribute("lastUnsilencedAlarmCount", // Update the value
                currentUnsilencedAlarmCount);
                // Indicate to UI that
                response.put("alarmsUpdated", true);
                // there is a new
                // alarm
                response.put("alarmsDoNotLog", doNotLogTotal);
                if (doNotLogTotal == 1)
                    response.put("doNotLogEvent", doNotLogEvent);
                response.put("alarmsNone", noneTotal);
                if (noneTotal == 1)
                    response.put("noneEvent", noneEvent);
                response.put("alarmsInformation", informationTotal);
                if (informationTotal == 1)
                    response.put("informationEvent", informationEvent);
                response.put("alarmsImportant", importantTotal);
                if (importantTotal == 1)
                    response.put("importantEvent", importantEvent);
                response.put("alarmsWarning", warningTotal);
                if (warningTotal == 1)
                    response.put("warningEvent", warningEvent);
                response.put("alarmsUrgent", urgentTotal);
                if (urgentTotal == 1)
                    response.put("urgentEvent", urgentEvent);
                response.put("alarmsCritical", criticalTotal);
                if (criticalTotal == 1)
                    response.put("criticalEvent", criticalEvent);
                response.put("alarmsLifeSafety", lifeSafetyTotal);
                if (lifeSafetyTotal == 1)
                    response.put("lifeSafetyEvent", lifeSafetyEvent);
            } else {
            // end if new alarm toaster info
            // response.put("alarmsUpdated",false);
            }
            // The events have changed. See if the user's particular max
            // alarm level has changed.
            int maxAlarmLevel = AlarmLevels.DO_NOT_LOG;
            if (lifeSafetyTotal > 0)
                maxAlarmLevel = AlarmLevels.LIFE_SAFETY;
            else if (criticalTotal > 0)
                maxAlarmLevel = AlarmLevels.CRITICAL;
            else if (urgentTotal > 0)
                maxAlarmLevel = AlarmLevels.URGENT;
            else if (warningTotal > 0)
                maxAlarmLevel = AlarmLevels.WARNING;
            else if (importantTotal > 0)
                maxAlarmLevel = AlarmLevels.IMPORTANT;
            else if (informationTotal > 0)
                maxAlarmLevel = AlarmLevels.INFORMATION;
            else if (noneTotal > 0)
                maxAlarmLevel = AlarmLevels.NONE;
            if (maxAlarmLevel != state.getMaxAlarmLevel()) {
                response.put("highestUnsilencedAlarmLevel", maxAlarmLevel);
                state.setMaxAlarmLevel(maxAlarmLevel);
            }
            // Check the max alarm. First check if the events have changed
            // since the last time this request checked.
            long lastEMUpdate = Common.eventManager.getLastAlarmTimestamp();
            // If there is a new alarm then do stuff
            if (state.getLastAlarmLevelChange() < lastEMUpdate) {
                state.setLastAlarmLevelChange(lastEMUpdate);
            } else {
            // end no new alarms
            // Don't add data for nothing, this will cause tons of
            // polls. response.put("alarmsUpdated",false);
            }
        }
        if (pollRequest.isPointDetails() && user != null) {
            PointDetailsState newState = DataPointDetailsDwr.getPointData();
            PointDetailsState responseState;
            PointDetailsState oldState = state.getPointDetailsState();
            if (oldState == null)
                responseState = newState;
            else {
                responseState = newState.clone();
                responseState.removeEqualValue(oldState);
            }
            if (!responseState.isEmpty()) {
                response.put("pointDetailsState", responseState);
                state.setPointDetailsState(newState);
            }
        }
        // TODO This code is used on the legacy alarms page
        if (pollRequest.isPendingAlarms() && user != null) {
            // Create the list of most current pending alarm content.
            Map<String, Object> model = new HashMap<>();
            model.put(MODEL_ATTR_EVENTS, eventDao.getPendingEvents(user.getId()));
            model.put("pendingEvents", true);
            model.put("noContentWhenEmpty", true);
            String currentContent = generateContent(httpRequest, "eventList.jsp", model);
            currentContent = com.serotonin.util.StringUtils.trimWhitespace(currentContent);
            if (!StringUtils.equals(currentContent, state.getPendingAlarmsContent())) {
                response.put("newAlarms", true);
                response.put("pendingAlarmsContent", currentContent);
                state.setPendingAlarmsContent(currentContent);
            } else {
                response.put("newAlarms", false);
            }
        }
        // Module handlers
        for (int i = 0; i < longPollHandlers.size(); i++) {
            LongPollHandler handler = longPollHandlers.get(i);
            handler.handleLongPoll(data, response, user);
        }
        if (!response.isEmpty())
            break;
        synchronized (pollRequest) {
            try {
                pollRequest.wait(waitTime);
            } catch (InterruptedException e) {
            // no op
            }
        }
    }
    if (pollRequest.isTerminated())
        response.put("terminated", true);
    return response;
}
Also used : EventInstance(com.serotonin.m2m2.rt.event.EventInstance) LongPollState(com.serotonin.m2m2.web.dwr.longPoll.LongPollState) User(com.serotonin.m2m2.vo.User) HashMap(java.util.HashMap) LongPollData(com.serotonin.m2m2.web.dwr.longPoll.LongPollData) LongPollHandler(com.serotonin.m2m2.web.dwr.longPoll.LongPollHandler) HttpServletRequest(javax.servlet.http.HttpServletRequest) EventDao(com.serotonin.m2m2.db.dao.EventDao) IMangoLifecycle(com.serotonin.m2m2.IMangoLifecycle) LongPollRequest(com.serotonin.m2m2.web.dwr.longPoll.LongPollRequest) PointDetailsState(com.serotonin.m2m2.web.dwr.beans.PointDetailsState) DwrPermission(com.serotonin.m2m2.web.dwr.util.DwrPermission)

Aggregations

DwrPermission (com.serotonin.m2m2.web.dwr.util.DwrPermission)3 LongPollData (com.serotonin.m2m2.web.dwr.longPoll.LongPollData)2 LongPollRequest (com.serotonin.m2m2.web.dwr.longPoll.LongPollRequest)2 IMangoLifecycle (com.serotonin.m2m2.IMangoLifecycle)1 EventDao (com.serotonin.m2m2.db.dao.EventDao)1 EventInstance (com.serotonin.m2m2.rt.event.EventInstance)1 User (com.serotonin.m2m2.vo.User)1 PointDetailsState (com.serotonin.m2m2.web.dwr.beans.PointDetailsState)1 LongPollHandler (com.serotonin.m2m2.web.dwr.longPoll.LongPollHandler)1 LongPollState (com.serotonin.m2m2.web.dwr.longPoll.LongPollState)1 HashMap (java.util.HashMap)1 HttpServletRequest (javax.servlet.http.HttpServletRequest)1