Search in sources :

Example 1 with PointDetailsState

use of com.serotonin.m2m2.web.dwr.beans.PointDetailsState 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)

Example 2 with PointDetailsState

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

the class DataPointDetailsDwr method getPointData.

public static PointDetailsState getPointData() {
    // Get the point from the user's session. It should have been set by the controller.
    HttpServletRequest request = WebContextFactory.get().getHttpServletRequest();
    User user = Common.getUser(request);
    DataPointVO pointVO = user.getEditPoint();
    // Create the watch list state.
    Map<String, Object> model = new HashMap<String, Object>();
    // Get the data point status from the data image.
    DataPointRT pointRT = Common.runtimeManager.getDataPoint(pointVO.getId());
    PointDetailsState state = new PointDetailsState();
    state.setId(Integer.toString(pointVO.getId()));
    PointValueTime pointValue = prepareBasePointState(Integer.toString(pointVO.getId()), state, pointVO, pointRT, model);
    setPrettyText(request, state, pointVO, model, pointValue);
    setChange(pointVO, state, pointRT, request, model, user);
    setEvents(pointVO, user, model, pointEventsLimit);
    setMessages(state, request, "dataPointMessages.jsp", model);
    return state;
}
Also used : HttpServletRequest(javax.servlet.http.HttpServletRequest) DataPointVO(com.serotonin.m2m2.vo.DataPointVO) User(com.serotonin.m2m2.vo.User) HashMap(java.util.HashMap) DataPointRT(com.serotonin.m2m2.rt.dataImage.DataPointRT) AnnotatedPointValueTime(com.serotonin.m2m2.rt.dataImage.AnnotatedPointValueTime) RenderedPointValueTime(com.serotonin.m2m2.web.dwr.beans.RenderedPointValueTime) PointValueTime(com.serotonin.m2m2.rt.dataImage.PointValueTime) PointDetailsState(com.serotonin.m2m2.web.dwr.beans.PointDetailsState)

Aggregations

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