use of com.serotonin.m2m2.web.dwr.longPoll.LongPollData 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);
}
use of com.serotonin.m2m2.web.dwr.longPoll.LongPollData in project ma-core-public by infiniteautomation.
the class BaseDwr method getLongPollData.
@SuppressWarnings("unchecked")
private List<LongPollData> getLongPollData() {
HttpSession session = WebContextFactory.get().getSession();
List<LongPollData> data = (List<LongPollData>) session.getAttribute(LONG_POLL_DATA_KEY);
if (data == null) {
synchronized (session) {
data = (List<LongPollData>) session.getAttribute(LONG_POLL_DATA_KEY);
if (data == null) {
data = new ArrayList<>();
session.setAttribute(LONG_POLL_DATA_KEY, data);
}
}
}
// Check for old data objects.
Long lastTimeoutCheck = (Long) session.getAttribute(LONG_POLL_DATA_TIMEOUT_KEY);
if (lastTimeoutCheck == null)
lastTimeoutCheck = 0L;
// Five
long cutoff = Common.timer.currentTimeMillis() - (1000 * 60 * 5);
// minutes.
if (lastTimeoutCheck < cutoff) {
synchronized (data) {
Iterator<LongPollData> iter = data.iterator();
while (iter.hasNext()) {
LongPollData lpd = iter.next();
if (lpd.getTimestamp() < cutoff)
iter.remove();
}
}
session.setAttribute(LONG_POLL_DATA_TIMEOUT_KEY, Common.timer.currentTimeMillis());
}
return data;
}
use of com.serotonin.m2m2.web.dwr.longPoll.LongPollData 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;
}
use of com.serotonin.m2m2.web.dwr.longPoll.LongPollData in project ma-core-public by infiniteautomation.
the class BaseDwr method resetLastAlarmLevelChange.
protected void resetLastAlarmLevelChange() {
List<LongPollData> data = getLongPollData();
synchronized (data) {
// Check if this user has a current long poll request (very likely)
for (LongPollData lpd : data) {
LongPollState state = lpd.getState();
// Reset the last alarm level change time so that the alarm
// level gets rechecked.
state.setLastAlarmLevelChange(0);
// Notify the long poll thread so that any change
notifyLongPollImpl(lpd.getRequest());
}
}
}
Aggregations