diff --git a/src/main/java/ch/ethz/seb/sebserver/gbl/model/session/ClientMonitoringData.java b/src/main/java/ch/ethz/seb/sebserver/gbl/model/session/ClientMonitoringData.java index 74275320..9f0b55d9 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gbl/model/session/ClientMonitoringData.java +++ b/src/main/java/ch/ethz/seb/sebserver/gbl/model/session/ClientMonitoringData.java @@ -24,8 +24,11 @@ public class ClientMonitoringData implements ClientMonitoringDataView { public final Long id; public final ConnectionStatus status; public final Map indicatorVals; + public final Integer notificationFlag; + public final boolean missingPing; - public final Boolean grantDenied; + public final boolean grantChecked; + public final boolean grantDenied; public final boolean pendingNotification; @JsonCreator @@ -33,16 +36,16 @@ public class ClientMonitoringData implements ClientMonitoringDataView { @JsonProperty(Domain.CLIENT_CONNECTION.ATTR_ID) final Long id, @JsonProperty(ATTR_STATUS) final ConnectionStatus status, @JsonProperty(ATTR_INDICATOR_VALUES) final Map indicatorVals, - @JsonProperty(ATTR_MISSING_PING) final boolean missingPing, - @JsonProperty(ATTR_GRANT_DENIED) final Boolean grantDenied, - @JsonProperty(ATTR_PENDING_NOTIFICATION) final boolean pendingNotification) { + @JsonProperty(ATTR_NOTIFICATION_FLAG) final Integer notificationFlag) { this.id = id; this.status = status; this.indicatorVals = indicatorVals; - this.missingPing = missingPing; - this.grantDenied = grantDenied; - this.pendingNotification = pendingNotification; + this.notificationFlag = notificationFlag; + this.missingPing = notificationFlag != null && (notificationFlag & FLAG_MISSING_PING) > 0; + this.grantChecked = notificationFlag == null || (notificationFlag & FLAG_GRANT_NOT_CHECKED) == 0; + this.grantDenied = notificationFlag != null && (notificationFlag & FLAG_GRANT_DENIED) > 0; + this.pendingNotification = notificationFlag != null && (notificationFlag & FLAG_PENDING_NOTIFICATION) > 0; } @Override @@ -61,24 +64,13 @@ public class ClientMonitoringData implements ClientMonitoringDataView { } @Override - public boolean isMissingPing() { - return this.missingPing; - } - - @Override - public Boolean isGrantDenied() { - return this.grantDenied; - } - - @Override - public boolean isPendingNotification() { - return this.pendingNotification; + public Integer notificationFlag() { + return this.notificationFlag; } public boolean hasChanged(final ClientMonitoringData other) { return this.status != other.status || - this.missingPing != other.missingPing || - !Objects.equals(this.grantDenied, other.grantDenied); + !Objects.equals(this.notificationFlag, other.notificationFlag); } public boolean indicatorValuesEquals(final ClientMonitoringData other) { diff --git a/src/main/java/ch/ethz/seb/sebserver/gbl/model/session/ClientMonitoringDataView.java b/src/main/java/ch/ethz/seb/sebserver/gbl/model/session/ClientMonitoringDataView.java index 30c9fde6..10e7e46e 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gbl/model/session/ClientMonitoringDataView.java +++ b/src/main/java/ch/ethz/seb/sebserver/gbl/model/session/ClientMonitoringDataView.java @@ -26,9 +26,13 @@ public interface ClientMonitoringDataView { public static final String ATTR_INFO = "in"; public static final String ATTR_INDICATOR_VALUES = "iv"; public static final String ATTR_CLIENT_GROUPS = "cg"; - public static final String ATTR_MISSING_PING = "mp"; - public static final String ATTR_GRANT_DENIED = "gd"; - public static final String ATTR_PENDING_NOTIFICATION = "pn"; + public static final String ATTR_NOTIFICATION_FLAG = "nf"; + + public static final int FLAG_MISSING_PING = 1; + public static final int FLAG_PENDING_NOTIFICATION = 2; + public static final int FLAG_GRANT_NOT_CHECKED = 4; + public static final int FLAG_GRANT_DENIED = 8; + public static final int FLAG_INVALID_SEB_VERSION = 16; @JsonProperty(Domain.CLIENT_CONNECTION.ATTR_ID) Long getId(); @@ -39,14 +43,28 @@ public interface ClientMonitoringDataView { @JsonProperty(ATTR_INDICATOR_VALUES) Map getIndicatorValues(); - @JsonProperty(ATTR_MISSING_PING) - boolean isMissingPing(); + @JsonProperty(ATTR_NOTIFICATION_FLAG) + Integer notificationFlag(); - @JsonProperty(ATTR_GRANT_DENIED) - Boolean isGrantDenied(); + default boolean isMissingPing() { + final Integer notificationFlag = notificationFlag(); + return notificationFlag != null && (notificationFlag & FLAG_MISSING_PING) > 0; + } - @JsonProperty(ATTR_PENDING_NOTIFICATION) - boolean isPendingNotification(); + default boolean isGrantChecked() { + final Integer notificationFlag = notificationFlag(); + return notificationFlag != null && (notificationFlag & FLAG_GRANT_NOT_CHECKED) == 0; + } + + default boolean isGrantDenied() { + final Integer notificationFlag = notificationFlag(); + return notificationFlag != null && (notificationFlag & FLAG_GRANT_DENIED) > 0; + } + + default boolean isPendingNotification() { + final Integer notificationFlag = notificationFlag(); + return notificationFlag != null && (notificationFlag & FLAG_PENDING_NOTIFICATION) > 0; + } public static Predicate getStatusPredicate(final ConnectionStatus... status) { final EnumSet states = EnumSet.noneOf(ConnectionStatus.class); diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/ResourceService.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/ResourceService.java index 768a7daa..a6e7a26c 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/ResourceService.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/ResourceService.java @@ -648,15 +648,14 @@ public class ResourceService { if (monitoringEntry.hasMissingPing()) { return missingPing; } - final Boolean grantDenied = monitoringEntry.grantDenied(); - if (grantDenied != null) { - if (grantDenied) { - return grantDeniedText; - } - } else if (monitoringEntry.showNoGrantCheckApplied()) { - return localizedNames.get(status) + grantMissingText; - } + if (!monitoringEntry.grantChecked()) { + if (monitoringEntry.showNoGrantCheckApplied()) { + return localizedNames.get(status) + grantMissingText; + } + } else if (monitoringEntry.grantDenied()) { + return grantDeniedText; + } } return localizedNames.get(status); diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ClientConnectionDetails.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ClientConnectionDetails.java index 60ca502b..8a85dcbb 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ClientConnectionDetails.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ClientConnectionDetails.java @@ -77,7 +77,8 @@ public class ClientConnectionDetails implements MonitoringEntry { public final boolean checkSecurityGrant; private ClientConnectionData connectionData = null; - public Boolean grantDenied = null; + public boolean grantChecked = false; + public boolean grantDenied = false; private boolean statusChanged = true; private boolean missingChanged = true; private long startTime = -1; @@ -169,7 +170,12 @@ public class ClientConnectionDetails implements MonitoringEntry { } @Override - public Boolean grantDenied() { + public boolean grantChecked() { + return this.grantChecked; + } + + @Override + public boolean grantDenied() { return this.grantDenied; } @@ -201,8 +207,10 @@ public class ClientConnectionDetails implements MonitoringEntry { } this.connectionData = connectionData; if (this.connectionData == null || this.connectionData.clientConnection.securityCheckGranted == null) { - this.grantDenied = null; + this.grantChecked = false; + this.grantDenied = false; } else { + this.grantChecked = true; this.grantDenied = !this.connectionData.clientConnection.securityCheckGranted; } if (this.startTime < 0) { diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ClientConnectionTable.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ClientConnectionTable.java index 52d8750e..688e2196 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ClientConnectionTable.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ClientConnectionTable.java @@ -479,7 +479,12 @@ public final class ClientConnectionTable implements FullPageMonitoringGUIUpdate } @Override - public Boolean grantDenied() { + public boolean grantChecked() { + return this.monitoringData.grantChecked; + } + + @Override + public boolean grantDenied() { return this.monitoringData.grantDenied; } diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ColorData.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ColorData.java index 832cc919..156fa450 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ColorData.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/session/ColorData.java @@ -41,10 +41,9 @@ public class ColorData { return this.defaultColor; } - final Boolean grantDenied = entry.grantDenied(); switch (status) { case ACTIVE: - return (grantDenied != null && grantDenied) + return (entry.grantChecked() && entry.grantDenied()) ? this.color3 : (entry.hasMissingPing()) ? this.color2 : this.color1; default: diff --git a/src/main/java/ch/ethz/seb/sebserver/gui/service/session/MonitoringEntry.java b/src/main/java/ch/ethz/seb/sebserver/gui/service/session/MonitoringEntry.java index 4c6082b0..1c1bf511 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gui/service/session/MonitoringEntry.java +++ b/src/main/java/ch/ethz/seb/sebserver/gui/service/session/MonitoringEntry.java @@ -16,13 +16,9 @@ public interface MonitoringEntry { boolean hasMissingPing(); - /** Indicates the security key grant check state - * true = grant denied - * false = granted - * null = not checked yet - * - * @return the security key grant check state */ - Boolean grantDenied(); + boolean grantChecked(); + + boolean grantDenied(); boolean showNoGrantCheckApplied(); diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/ClientConnectionDataInternal.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/ClientConnectionDataInternal.java index 56cdbc88..f06413dd 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/ClientConnectionDataInternal.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/ClientConnectionDataInternal.java @@ -46,7 +46,7 @@ public class ClientConnectionDataInternal extends ClientConnectionData { private final Boolean grantDenied; - protected ClientConnectionDataInternal( + public ClientConnectionDataInternal( final ClientConnection clientConnection, final PendingNotificationIndication pendingNotificationIndication, final List clientIndicators, @@ -141,18 +141,38 @@ public class ClientConnectionDataInternal extends ClientConnectionData { } @Override + public Integer notificationFlag() { + final int flag = 0 + | (isMissingPing() ? ClientMonitoringDataView.FLAG_MISSING_PING : 0) + | (isPendingNotification() ? ClientMonitoringDataView.FLAG_PENDING_NOTIFICATION : 0) + | (!isGrantChecked() ? ClientMonitoringDataView.FLAG_GRANT_NOT_CHECKED : 0) + | (isGrantDenied() ? ClientMonitoringDataView.FLAG_GRANT_DENIED : 0); + + return (flag > 0) ? flag : null; + } + + @Override + @JsonIgnore public boolean isMissingPing() { return BooleanUtils.isTrue(getMissingPing()); } @Override + @JsonIgnore public boolean isPendingNotification() { return BooleanUtils.isTrue(pendingNotification()); } @Override - public Boolean isGrantDenied() { - return ClientConnectionDataInternal.this.grantDenied; + @JsonIgnore + public boolean isGrantChecked() { + return ClientConnectionDataInternal.this.grantDenied != null; + } + + @Override + @JsonIgnore + public boolean isGrantDenied() { + return BooleanUtils.isTrue(ClientConnectionDataInternal.this.grantDenied); } }; diff --git a/src/test/java/ch/ethz/seb/sebserver/gbl/model/ModelObjectJSONGenerator.java b/src/test/java/ch/ethz/seb/sebserver/gbl/model/ModelObjectJSONGenerator.java index 872ba935..3a2b5dd0 100644 --- a/src/test/java/ch/ethz/seb/sebserver/gbl/model/ModelObjectJSONGenerator.java +++ b/src/test/java/ch/ethz/seb/sebserver/gbl/model/ModelObjectJSONGenerator.java @@ -9,9 +9,11 @@ package ch.ethz.seb.sebserver.gbl.model; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Locale; +import java.util.Set; import java.util.UUID; import org.joda.time.DateTime; @@ -70,6 +72,10 @@ import ch.ethz.seb.sebserver.gbl.model.user.UserLogActivityType; import ch.ethz.seb.sebserver.gbl.model.user.UserMod; import ch.ethz.seb.sebserver.gbl.model.user.UserRole; import ch.ethz.seb.sebserver.gbl.monitoring.SimpleIndicatorValue; +import ch.ethz.seb.sebserver.webservice.datalayer.batis.model.ClientEventRecord; +import ch.ethz.seb.sebserver.webservice.servicelayer.session.ClientIndicator; +import ch.ethz.seb.sebserver.webservice.servicelayer.session.PendingNotificationIndication; +import ch.ethz.seb.sebserver.webservice.servicelayer.session.impl.ClientConnectionDataInternal; public class ModelObjectJSONGenerator { @@ -282,8 +288,30 @@ public class ModelObjectJSONGenerator { System.out.println(domainObject.getClass().getSimpleName() + ":"); System.out.println(writerWithDefaultPrettyPrinter.writeValueAsString(domainObject)); + final ClientConnectionDataInternal clientConnectionDataInternal = new ClientConnectionDataInternal( + new ClientConnection( + 1L, 1L, 1L, ConnectionStatus.ACTIVE, UUID.randomUUID().toString(), + "user-account-1", "86.119.30.213", + "seb_os_name", "seb_machine_name", "seb_version", + "vdiID", true, "", currentTimeMillis, currentTimeMillis, + 123L, + true, + false, null), + new PendingNotificationIndication() { + @Override + public boolean notifictionPending() { + return false; + } + }, + Arrays.asList( + new ClientIndicatorTestImpl(1L, 1.0), + new ClientIndicatorTestImpl(2L, 2.0), + new ClientIndicatorTestImpl(3L, 3.0)), + new HashSet<>(Arrays.asList(1L, 2L))); + System.out.println(domainObject.getClass().getSimpleName() + ":"); - System.out.println(writerWithDefaultPrettyPrinter.writeValueAsString(domainObject)); + System.out.println( + writerWithDefaultPrettyPrinter.writeValueAsString(clientConnectionDataInternal.monitoringDataView)); domainObject = new ClientEvent(1L, 1L, EventType.WARN_LOG, System.currentTimeMillis(), System.currentTimeMillis(), 123.0, "text"); @@ -326,4 +354,75 @@ public class ModelObjectJSONGenerator { } + private static class ClientIndicatorTestImpl implements ClientIndicator { + + public final Long indicatorId; + public final double value; + + public ClientIndicatorTestImpl(final Long indicatorId, final double value) { + this.value = value; + this.indicatorId = indicatorId; + } + + @Override + public Long getIndicatorId() { + // TODO Auto-generated method stub + return this.indicatorId; + } + + @Override + public double getValue() { + return this.value; + } + + @Override + public void init(final Indicator indicatorDefinition, final Long connectionId, final boolean active, + final boolean cachingEnabled) { + } + + @Override + public IndicatorType getType() { + return IndicatorType.ERROR_COUNT; + } + + @Override + public Long examId() { + return 1L; + } + + @Override + public Long connectionId() { + return 1L; + } + + @Override + public double computeValueAt(final long timestamp) { + return 0; + } + + @Override + public Set observedEvents() { + return Collections.emptySet(); + } + + @Override + public void notifyValueChange(final ClientEvent event) { + // TODO Auto-generated method stub + + } + + @Override + public void notifyValueChange(final ClientEventRecord clientEventRecord) { + // TODO Auto-generated method stub + + } + + @Override + public boolean hasIncident() { + // TODO Auto-generated method stub + return false; + } + + } + }