From e0892217a095ec3f95ca7abaa35ae605f706ac98 Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Mon, 6 Nov 2023 20:16:17 +0100 Subject: [PATCH 01/63] #2755 Signaling the Data Source that has a problem - Created class: DataPointUnreliableUtils; Signaling added in: * Meta Data Source; * SNMP; * HTTP Retriever; * BACnet I/P; * DNP3 (IP/Serial); Signaling use DataPointUnreliableUtils in: * Modbus IP/Serial; * Viconics; * Pachube; * MQTT/AMQP --- .../rt/dataSource/dnp3/Dnp3DataSource.java | 10 ++++- .../rt/dataSource/dnp3/Dnp3IpDataSource.java | 10 ++++- .../dataSource/dnp3/Dnp3SerialDataSource.java | 11 ++++- .../dataSource/DataPointUnreliableUtils.java | 40 +++++++++++++++++++ .../mango/rt/dataSource/DataSourceRT.java | 1 + .../bacnet/BACnetIPDataSourceRT.java | 34 +++++++++++++--- .../http/HttpRetrieverDataSourceRT.java | 8 ++++ .../dataSource/meta/MetaPointLocatorRT.java | 13 +++++- .../dataSource/modbus/ModbusDataSource.java | 21 ++++++---- .../pachube/PachubeDataSourceRT.java | 14 ++++--- .../rt/dataSource/snmp/SnmpDataSourceRT.java | 37 +++++++++++++---- .../viconics/ViconicsDataSourceRT.java | 9 +++-- .../ds/messaging/MessagingDataSourceRT.java | 17 ++++---- .../channel/UpdatePointValueConsumer.java | 6 ++- 14 files changed, 185 insertions(+), 46 deletions(-) create mode 100644 src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java index 8a28831d8b..519fb07375 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java @@ -21,6 +21,8 @@ import com.serotonin.messaging.TimeoutException; import com.serotonin.web.i18n.LocalizableMessage; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; + public class Dnp3DataSource extends PollingDataSource { private final Log LOG = LogFactory.getLog(Dnp3DataSource.class); @@ -44,7 +46,9 @@ protected void doPoll(long time) { try { dnp3Master.doPoll(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); + resetUnreliableDataPoints(dataPoints); } catch (Exception e) { + setUnreliableDataPoints(dataPoints); LOG.warn(e.getMessage(), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", vo.getName(), e @@ -82,7 +86,9 @@ public void terminate() { super.terminate(); try { dnp3Master.terminate(); + resetUnreliableDataPoints(dataPoints); } catch (Exception e) { + setUnreliableDataPoints(dataPoints); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); @@ -108,8 +114,10 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, dnp3Master .sendAnalogCommand(index, valueTime.getIntegerValue()); } + resetUnreliableDataPoint(dataPoint); } catch (Exception e) { - e.printStackTrace(); + setUnreliableDataPoint(dataPoint); + LOG.error(e.getMessage(), e); } } diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java index 1ae960efe9..daafdc9da6 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java @@ -5,8 +5,14 @@ import br.org.scadabr.vo.dataSource.dnp3.Dnp3IpDataSourceVO; import com.serotonin.web.i18n.LocalizableMessage; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; public class Dnp3IpDataSource extends Dnp3DataSource { + + private static final Log LOG = LogFactory.getLog(Dnp3IpDataSource.class); private final Dnp3IpDataSourceVO configuration; public Dnp3IpDataSource(Dnp3IpDataSourceVO configuration) { @@ -23,8 +29,10 @@ public void initialize() { configuration.getSlaveAddress(), configuration.getHost(), configuration.getPort(), configuration .getStaticPollPeriods()); + resetUnreliableDataPoints(dataPoints); } catch (Exception e) { - e.printStackTrace(); + setUnreliableDataPoints(dataPoints); + LOG.error(e.getMessage(), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", configuration .getName(), e.getMessage())); diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java index 25524adbeb..45d5c7a9cd 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java @@ -8,8 +8,15 @@ import com.serotonin.mango.rt.dataSource.DataSourceRT; import com.serotonin.web.i18n.LocalizableMessage; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoints; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.setUnreliableDataPoints; public class Dnp3SerialDataSource extends Dnp3DataSource { + + private static final Log LOG = LogFactory.getLog(Dnp3SerialDataSource.class); private final Dnp3SerialDataSourceVO configuration; public Dnp3SerialDataSource(Dnp3SerialDataSourceVO configuration) { @@ -26,8 +33,10 @@ public void initialize() { configuration.getSlaveAddress(), configuration .getCommPortId(), configuration.getBaudRate(), configuration.getStaticPollPeriods()); + resetUnreliableDataPoints(dataPoints); } catch (Exception e) { - e.printStackTrace(); + setUnreliableDataPoints(dataPoints); + LOG.error(e.getMessage(), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", configuration .getName(), e.getMessage())); diff --git a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java new file mode 100644 index 0000000000..572513071b --- /dev/null +++ b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java @@ -0,0 +1,40 @@ +package com.serotonin.mango.rt.dataSource; + +import com.serotonin.mango.rt.dataImage.DataPointRT; + +import java.util.List; + +public final class DataPointUnreliableUtils { + + public static final String ATTR_UNRELIABLE_KEY = "UNRELIABLE"; + + private DataPointUnreliableUtils() {} + + public static void setUnreliableDataPoints(List dataPoints) { + for (DataPointRT dp : dataPoints) { + setUnreliableDataPoint(dp); + } + } + + public static void resetUnreliableDataPoints(List dataPoints) { + for (DataPointRT dp : dataPoints) { + resetUnreliableDataPoint(dp); + } + } + + public static void setUnreliableDataPoint(DataPointRT dataPoint) { + setUnreliableDataPoint(ATTR_UNRELIABLE_KEY, dataPoint); + } + + public static void resetUnreliableDataPoint(DataPointRT dataPoint) { + resetUnreliableDataPoint(ATTR_UNRELIABLE_KEY, dataPoint); + } + + public static void setUnreliableDataPoint(String key, DataPointRT dataPoint) { + dataPoint.setAttribute(key, true); + } + + public static void resetUnreliableDataPoint(String key, DataPointRT dataPoint) { + dataPoint.setAttribute(key, false); + } +} diff --git a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java index 620260cc36..317201a178 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java @@ -49,6 +49,7 @@ * @author Matthew Lohbihler */ abstract public class DataSourceRT implements ILifecycle { + @Deprecated(since = "2.7.7") public static final String ATTR_UNRELIABLE_KEY = "UNRELIABLE"; private final DataSourceVO vo; diff --git a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java index 1407d64a20..859eb22f2a 100644 --- a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java @@ -90,6 +90,8 @@ import com.serotonin.web.i18n.LocalizableMessage; import com.serotonin.web.taglib.DateFunctions; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; + /** * @author Matthew Lohbihler */ @@ -135,8 +137,10 @@ public void initialize() { // Deactivate any existing event. returnToNormal(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis()); + resetUnreliableDataPoints(dataPoints); } catch (Exception e) { + setUnreliableDataPoints(dataPoints); raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); return; @@ -147,8 +151,10 @@ public void initialize() { // Let everyone know we're here. try { localDevice.sendBroadcast(localDevice.getIAm()); + resetUnreliableDataPoints(dataPoints); } catch (BACnetException e) { + setUnreliableDataPoints(dataPoints); fireMessageExceptionEvent("event.bacnet.iamError", e.getMessage()); } @@ -163,8 +169,10 @@ public void initialize() { catch (InterruptedException e) { // no op } + resetUnreliableDataPoints(dataPoints); } catch (BACnetException e) { + setUnreliableDataPoints(dataPoints); fireMessageExceptionEvent("event.bacnet.whoisError", e.getMessage()); } @@ -220,8 +228,10 @@ public void addDataPoint(DataPointRT dataPoint) { // Send a whois to get remote device data. try { localDevice.sendUnconfirmed(address, null, new WhoIsRequest()); + resetUnreliableDataPoint(dataPoint); } catch (BACnetException e) { + setUnreliableDataPoint(dataPoint); fireMessageExceptionEvent("event.bacnet.whoisPoint", dataPoint.getVO().getName(), e.getMessage()); disablePoint(dataPoint); return; @@ -249,17 +259,20 @@ public void addDataPoint(DataPointRT dataPoint) { // If we still don't have the device, try to get it manually. try { d = localDevice.findRemoteDevice(address, network, locator.getRemoteDeviceInstanceNumber()); + resetUnreliableDataPoint(dataPoint); } catch (BACnetException e) { // Ignore. } catch (PropertyValueException e) { + setUnreliableDataPoint(dataPoint); // Shouldn't happen, so just log. log.error("Couldn't manually get segmentation and vendor id from device", e); } } if (d == null) { + setUnreliableDataPoint(dataPoint); // If we still don't have the device, call it in. fireDeviceExceptionEvent("event.bacnet.deviceError", address.toIpString()); disablePoint(dataPoint); @@ -273,6 +286,7 @@ public void addDataPoint(DataPointRT dataPoint) { } super.addDataPoint(dataPoint); + resetUnreliableDataPoint(dataPoint); } } @@ -368,11 +382,11 @@ public String getDetails() { } private String getPoints() { - if(dataPoints == null) { + if(points == null) { return ""; } StringBuilder info = new StringBuilder(); - for(DataPointRT dataPoint: dataPoints) { + for(DataPointRT dataPoint: points) { info.append(LoggingUtils.dataPointInfo(dataPoint.getVO())).append("\n"); } return info.toString(); @@ -390,7 +404,7 @@ void pollDevice(RemoteDevice d, List points, long time) { try { // Send the read request. PropertyValues values = localDevice.readProperties(d, refs); - + resetUnreliableDataPoints(points); // Dereference the property values back into the points. for (DataPointRT dp : points) { BACnetIPPointLocatorRT locator = dp.getPointLocator(); @@ -399,6 +413,7 @@ void pollDevice(RemoteDevice d, List points, long time) { } } catch (BACnetException e) { + setUnreliableDataPoints(points); fireMessageExceptionEvent("event.bacnet.readDevice", d.getAddress().toIpString(), e.getMessage()); } } @@ -420,14 +435,17 @@ public void forcePointRead(DataPointRT dataPoint) { } private void dereferencePoint(DataPointRT dp, Encodable encodable, long time) { - if (encodable == null) + if (encodable == null) { + setUnreliableDataPoint(dp); fireDeviceExceptionEvent("event.bacnet.readError", dp.getVO().getName(), "no value returned"); - else if (encodable instanceof BACnetError) + } else if (encodable instanceof BACnetError) { + setUnreliableDataPoint(dp); fireDeviceExceptionEvent("event.bacnet.readError", dp.getVO().getName(), ((BACnetError) encodable).getErrorCode()); - else { + } else { MangoValue value = encodableToValue(encodable, dp.getDataTypeId()); dp.updatePointValue(new PointValueTime(value, time)); + resetUnreliableDataPoint(dp); } } @@ -446,8 +464,10 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime pvt, SetPointSou new UnsignedInteger(locator.getWritePriority())); localDevice.send(locator.getRemoteDevice(), writeRequest); dataPoint.setPointValue(pvt, source); + resetUnreliableDataPoint(dataPoint); } catch (Throwable t) { + setUnreliableDataPoint(dataPoint); fireMessageExceptionEvent("event.setPointFailed", t.getMessage()); } } @@ -621,11 +641,13 @@ boolean sendCovSubscription(DataPointRT dataPoint, boolean unsubscribe) { try { sendCovSubscriptionImpl(locator.getRemoteDevice(), locator.getOid(), locator.getCovId(), unsubscribe); + resetUnreliableDataPoint(dataPoint); } catch (BACnetException e) { // If we are unsubscribing a failure doesn't really matter since the lease will expire eventually anyway, // so ignore. if (!unsubscribe) { + setUnreliableDataPoint(dataPoint); fireMessageExceptionEvent("event.bacnet.covFailed", locator.getRemoteDevice().getAddress().toIpString(), e.getMessage()); disablePoint(dataPoint); diff --git a/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java index d8c1483921..445a8ab405 100644 --- a/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java @@ -41,6 +41,8 @@ import java.util.Collections; import java.util.List; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; + /** * @author Matthew Lohbihler */ @@ -71,6 +73,7 @@ public HttpRetrieverDataSourceRT(HttpRetrieverDataSourceVO vo, StopSleepRT stopS public void removeDataPoint(DataPointRT dataPoint) { returnToNormal(PARSE_EXCEPTION_EVENT, System.currentTimeMillis()); super.removeDataPoint(dataPoint); + resetUnreliableDataPoint(dataPoint); } @Override @@ -83,7 +86,9 @@ protected void doPoll(long time) { String data; try { data = getData(vo.getUrl(), vo.getTimeoutSeconds(), vo.getRetries(), vo.isStop(), vo.getReactivation(), vo.getStaticHeaders()); + resetUnreliableDataPoints(dataPoints); } catch (Exception e) { + setUnreliableDataPoints(dataPoints); LocalizableMessage lm; if (e instanceof LocalizableException) lm = ((LocalizableException) e).getLocalizableMessage(); @@ -113,14 +118,17 @@ protected void doPoll(long time) { // Save the new value dp.updatePointValue(new PointValueTime(value, valueTime)); + resetUnreliableDataPoint(dp); } catch (NoMatchException e) { if (!locator.isIgnoreIfMissing()) { if (parseErrorMessage == null) parseErrorMessage = e.getLocalizableMessage(); + setUnreliableDataPoint(dp); } } catch (LocalizableException e) { if (parseErrorMessage == null) parseErrorMessage = e.getLocalizableMessage(); + setUnreliableDataPoint(dp); } } diff --git a/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java b/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java index a6c3f2e1a5..081f54b8cb 100644 --- a/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java +++ b/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java @@ -46,6 +46,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; import static com.serotonin.mango.util.LoggingScriptUtils.generateContext; import static com.serotonin.mango.util.LoggingScriptUtils.infoErrorExecutionScript; import static com.serotonin.mango.util.LoggingScriptUtils.infoErrorInitializationScript; @@ -230,6 +231,7 @@ public void run(long fireTime) { void execute(long runtime, List sourceIds) { if (context == null) { + setUnreliableDataPoint(dataPoint); LOG.warn("MetaPointLocatorRT.context is null, Context: " + generateContext(dataPoint, dataSource)); return; } @@ -242,6 +244,7 @@ void execute(long runtime, List sourceIds) { } if (count > MAX_RECURSION) { + setUnreliableDataPoint(dataPoint); handleError(runtime, new LocalizableMessage("event.meta.recursionFailure")); String msg = MessageFormat.format("Recursion failure: exceeded MAX_RECURSION: expected <= {0} but was {1}, Context: {2}", String.valueOf(MAX_RECURSION), count, generateContext(dataPoint, dataSource)); @@ -256,10 +259,12 @@ void execute(long runtime, List sourceIds) { try { PointValueTime pvt = executor.execute(vo.getScript(), context, timer.currentTimeMillis(), vo.getDataTypeId(), runtime); - if (pvt.getValue() == null) + if (pvt.getValue() == null) { handleError(runtime, new LocalizableMessage("event.meta.nullResult")); - else + } else { updatePoint(pvt); + resetUnreliableDataPoint(dataPoint); + } } catch (ScriptException e) { handleError(runtime, new LocalizableMessage("common.default", e.getMessage())); @@ -270,6 +275,7 @@ void execute(long runtime, List sourceIds) { LOG.warn(infoErrorExecutionScript(e, dataPoint, dataSource)); } catch (Exception e) { + setUnreliableDataPoint(dataPoint); LOG.warn(infoErrorExecutionScript(e, dataPoint, dataSource)); throw e; } @@ -284,7 +290,9 @@ private void createContext() { try { ScriptExecutor scriptExecutor = new ScriptExecutor(); context = scriptExecutor.convertContext(vo.getContext()); + resetUnreliableDataPoint(dataPoint); } catch (Exception e) { + setUnreliableDataPoint(dataPoint); LOG.warn(infoErrorInitializationScript(e, dataPoint, dataSource)); } } @@ -316,6 +324,7 @@ protected void updatePoint(PointValueTime pvt) { } protected void handleError(long runtime, LocalizableMessage message) { + setUnreliableDataPoint(dataPoint); dataSource.raiseScriptError(runtime, dataPoint, message); } } diff --git a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java index 5361b9ca47..69e3e9b3f8 100644 --- a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java @@ -50,6 +50,8 @@ import com.serotonin.modbus4j.sero.messaging.TimeoutException; import com.serotonin.web.i18n.LocalizableMessage; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; + abstract public class ModbusDataSource extends PollingDataSource implements MessagingExceptionHandler { private final Log LOG = LogFactory.getLog(ModbusDataSource.class); @@ -78,7 +80,7 @@ public void addDataPoint(DataPointRT dataPoint) { // Mark the point as unreliable. ModbusPointLocatorVO locatorVO = dataPoint.getVO().getPointLocator(); if (!locatorVO.isSlaveMonitor() && !locatorVO.isSocketMonitor()) - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dataPoint); // Slave monitor points. if (vo.isCreateSlaveMonitorPoints()) { @@ -220,7 +222,7 @@ protected void doPoll(long time) { dataPoint.getVO().getName(), exceptionResult.getExceptionMessage())); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dataPoint); // A response, albeit an undesirable one, was received // from @@ -255,7 +257,7 @@ protected void doPoll(long time) { dataSourceExceptions = true; - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dataPoint); } else { /* * When an event is raised from the Callback @@ -275,7 +277,7 @@ protected void doPoll(long time) { + " eventRaised: " + eventRaised); if (!eventRaised) { returnToNormal(POINT_READ_EXCEPTION_EVENT, time); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, false); + resetUnreliableDataPoint(dataPoint); updatePointValue(dataPoint, locator, result, time); slaveStatuses.put(locator.getVO().getSlaveId(), true); } @@ -342,7 +344,9 @@ protected void initialize(ModbusMaster modbusMaster) { // Deactivate any existing event. returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + resetUnreliableDataPoints(dataPoints); } catch (Exception e) { + setUnreliableDataPoints(dataPoints); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getLocalExceptionMessage(e)); return; @@ -387,17 +391,17 @@ public void forcePointRead(DataPointRT dataPoint) { Object value = modbusMaster.getValue(ml); returnToNormal(POINT_READ_EXCEPTION_EVENT, time); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, false); + resetUnreliableDataPoint(dataPoint); updatePointValue(dataPoint, pl, value, time); } catch (ErrorResponseException e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", dataPoint .getVO().getName(), e.getMessage())); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dataPoint); } catch (ModbusTransportException e) { // Don't raise a data source exception. Polling should do that. LOG.warn("Error during forcePointRead", e); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dataPoint); } } } @@ -457,7 +461,9 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, // Deactivate any existing event. returnToNormal(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime()); + resetUnreliableDataPoint(dataPoint); } catch (ModbusTransportException e) { + setUnreliableDataPoint(dataPoint); if (e.getMessage().contains("no active connection")) { // Raise an event. raiseEvent(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime(), @@ -472,6 +478,7 @@ true, new LocalizableMessage("event.exception2", LOG.info("Error setting point value", e); } } catch (ErrorResponseException e) { + setUnreliableDataPoint(dataPoint); raiseEvent(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime(), true, new LocalizableMessage("event.exception2", dataPoint .getVO().getName(), e.getErrorResponse() diff --git a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java index 5a2520fe38..a0c72bc7e8 100644 --- a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java @@ -59,6 +59,8 @@ import com.serotonin.web.i18n.LocalizableException; import com.serotonin.web.i18n.LocalizableMessage; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; + public class PachubeDataSourceRT extends PollingDataSource { public static final int DATA_RETRIEVAL_FAILURE_EVENT = 1; public static final int PARSE_EXCEPTION_EVENT = 2; @@ -92,7 +94,7 @@ public static HttpClient createHttpClient(int timeoutSeconds, int retries) { @Override public void addDataPoint(DataPointRT dataPoint) { super.addDataPoint(dataPoint); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dataPoint); } @Override @@ -147,7 +149,7 @@ protected void pollFeed(int feedId, List points, long time) { // Mark points as unreliable. for (DataPointRT point : points) - point.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(point); return; } @@ -164,7 +166,7 @@ protected void pollFeed(int feedId, List points, long time) { if (dataValue == null) { parseErrorMessage = new LocalizableMessage("event.pachube.dataStreamNotFound", locator.getDataStreamId(), feedId); - dp.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dp); } else { try { @@ -185,18 +187,18 @@ protected void pollFeed(int feedId, List points, long time) { // Save the new value if it is new if (!ObjectUtils.isEqual(dp.getPointValue(), pvt)) dp.updatePointValue(new PointValueTime(value, valueTime)); - dp.setAttribute(ATTR_UNRELIABLE_KEY, false); + resetUnreliableDataPoint(dp); } catch (LocalizableException e) { if (parseErrorMessage == null) parseErrorMessage = e.getLocalizableMessage(); - dp.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dp); } catch (ParseException e) { if (parseErrorMessage == null) parseErrorMessage = new LocalizableMessage("event.valueParse.timeParsePoint", dataValue.getTimestamp(), dp.getVO().getName()); - dp.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dp); } } } diff --git a/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java index 1de498569a..831dc9a27c 100644 --- a/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java @@ -31,6 +31,8 @@ import com.serotonin.web.i18n.LocalizableMessage; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; + /** * @author Matthew Lohbihler * @@ -141,10 +143,13 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, PDU response = snmpRequests.getResponseBySet(); LocalizableMessage message = validatePdu(response); - if (message != null) + if (message != null) { + setUnreliableDataPoint(dataPoint); raiseEvent(PDU_EXCEPTION_EVENT, valueTime.getTime(), false, message); - else + } else { dataPoint.setPointValue(valueTime, source); + resetUnreliableDataPoint(dataPoint); + } } public void setDeviceDidNotRespondDespiteTheCounterOfRetries(boolean deviceDidNotRespondDespiteTheCounterOfRetries) { this.deviceDidNotRespondDespiteTheCounterOfRetries = deviceDidNotRespondDespiteTheCounterOfRetries; @@ -209,8 +214,10 @@ private void doPollImpl(long time) throws IOException { } } else { if (!isSnmpConnectionIsAlive()) { + setUnreliableDataPoints(dataPoints); // Common.ctx.getRuntimeManager().stopDataSourceAndDontJoinTermination(vo.getId()); } else if (message != null) { + setUnreliableDataPoints(dataPoints); raiseEvent(PDU_EXCEPTION_EVENT, time, true, message); } } @@ -224,7 +231,9 @@ private void doPollImpl(long time) throws IOException { updatePoint(dp, vb.getVariable(), time); } } + resetUnreliableDataPoints(dataPoints); } else { + setUnreliableDataPoints(dataPoints); raiseEvent(PDU_EXCEPTION_EVENT, time, true, validatePdu(response)); } @@ -273,8 +282,12 @@ private boolean logEventsDependsOnMessageType(MessageType messageType, VariableB break; } - if(messageType!=MessageType.undefined) - raiseEvent(PDU_EXCEPTION_EVENT,time,true,message); + if(messageType!=MessageType.undefined) { + setUnreliableDataPoint(dp); + raiseEvent(PDU_EXCEPTION_EVENT, time, true, message); + } else { + resetUnreliableDataPoint(dp); + } return messageType!=MessageType.undefined; } @@ -334,9 +347,11 @@ void receivedTrap(PDU trap) { // Take a look at the response. LocalizableMessage message = validatePdu(trap); - if (message != null) + if (message != null) { + setUnreliableDataPoints(dataPoints); raiseEvent(PDU_EXCEPTION_EVENT, time, false, message); - else { + } else { + resetUnreliableDataPoints(dataPoints); synchronized (pointListChangeLock) { updateChangedPoints(); @@ -352,9 +367,13 @@ void receivedTrap(PDU trap) { } } - if (!found) - raiseEvent(TRAP_NOT_HANDLED_EVENT, time, false, new LocalizableMessage("event.snmp.trapNotHandled", vb)); + if (!found) { + setUnreliableDataPoints(dataPoints); + raiseEvent(TRAP_NOT_HANDLED_EVENT, time, false, new LocalizableMessage("event.snmp.trapNotHandled", vb)); log.warn("Trap not handled: " + vb); + } else { + resetUnreliableDataPoints(dataPoints); + } } } } @@ -383,7 +402,9 @@ public void initialize() { // Deactivate any existing event. returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + resetUnreliableDataPoints(dataPoints); } catch (Exception e) { + setUnreliableDataPoints(dataPoints); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, DataSourceRT.getExceptionMessage(e)); log.debug("Error while initializing data source", e); diff --git a/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java index bcd6e9b2e1..44a965b6e1 100644 --- a/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -147,7 +148,7 @@ public void addDataPoint(DataPointRT dataPoint) { super.addDataPoint(dataPoint); // Mark the point as unreliable. - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + DataPointUnreliableUtils.setUnreliableDataPoint(dataPoint); // Add the point to the lookup map. pointLookup.put(new PointKey(dataPoint), dataPoint); @@ -179,7 +180,7 @@ public void viconicsNetworkStatus(boolean online) { // Mark all points as unreliable. synchronized (dataPoints) { for (DataPointRT rt : dataPoints) - rt.setAttribute(ATTR_UNRELIABLE_KEY, true); + DataPointUnreliableUtils.setUnreliableDataPoint(rt); } if (online) @@ -393,7 +394,7 @@ public void viconicsDeviceStatus(ViconicsDevice device, boolean online) { .getPointLocator(); if (Arrays .equals(locator.getDeviceIeee(), device.getIeee())) - rt.setAttribute(ATTR_UNRELIABLE_KEY, true); + DataPointUnreliableUtils.setUnreliableDataPoint(rt); } } @@ -472,7 +473,7 @@ public void viconicsDevicePointUpdated(ViconicsDevice device, throw new ShouldNeverHappenException("Unknown point type: " + point.getClass()); - rt.setAttribute(ATTR_UNRELIABLE_KEY, false); + DataPointUnreliableUtils.resetUnreliableDataPoint(rt); rt.updatePointValue(new PointValueTime(mangoValue, time)); } diff --git a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java index b4345a7787..7a2f9d46b0 100644 --- a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java +++ b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java @@ -16,12 +16,13 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; import static com.serotonin.mango.util.LoggingUtils.*; public class MessagingDataSourceRT extends PollingDataSource { - private static final String ATTR_UNRELIABLE_KEY = "UNRELIABLE"; + private static final String ATTR_UPDATE_ERROR_KEY = "DP_UPDATE_ERROR"; public static final int DATA_SOURCE_EXCEPTION_EVENT = 1; @@ -52,20 +53,20 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPo LOG.warn("Error Publish: " + dataSourcePointValueTimeInfo(vo, dataPointVO, valueTime, source)); raiseEvent(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(new RuntimeException("Error Publish: " + dataSourcePointValueTimeInfo(vo, dataPointVO, valueTime, source) + ", Message: Connection Closed. "))); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dataPoint); return; } String message = valueTime.getStringValue(); try { messagingService.publish(dataPoint, message); returnToNormal(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis()); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, false); + resetUnreliableDataPoint(dataPoint); } catch (Exception e) { LOG.error(dataSourcePointValueTimeInfo(vo, dataPointVO, valueTime, source) + ", " + exceptionInfo(e), e); raiseEvent(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("event.ds.publishFailed", dataPointVO.getName())); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dataPoint); } } @@ -101,12 +102,12 @@ public void addDataPoint(DataPointRT dataPoint) { try { updateAttemptsCounters.putIfAbsent(dataPoint.getId(), new AtomicInteger()); messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), ATTR_UPDATE_ERROR_KEY); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, false); + resetUnreliableDataPoint(dataPoint); } catch (Exception e) { LOG.error(exceptionInfo(e), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), false, getExceptionMessage(e)); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dataPoint); } super.addDataPoint(dataPoint); } @@ -134,14 +135,14 @@ protected void doPoll(long time) { messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), ATTR_UPDATE_ERROR_KEY); updateAttemptsCounters.get(dataPoint.getId()).set(0); returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis()); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, false); + resetUnreliableDataPoint(dataPoint); } } catch (Exception e) { updateAttemptsCounters.get(dataPoint.getId()).incrementAndGet(); LOG.warn(exceptionInfo(e), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e)); - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, true); + setUnreliableDataPoint(dataPoint); } } } diff --git a/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java b/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java index 29bdb9963e..ada1108da5 100644 --- a/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java +++ b/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java @@ -5,6 +5,8 @@ import java.nio.charset.StandardCharsets; import java.util.function.Consumer; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; + public class UpdatePointValueConsumer implements Consumer { private final DataPointRT dataPoint; @@ -26,10 +28,10 @@ public void accept(byte[] payload) { try { String message = new String(payload, StandardCharsets.UTF_8); dataPoint.updatePointValue(message); - dataPoint.setAttribute(updateErrorKey, false); + resetUnreliableDataPoint(updateErrorKey, dataPoint); } catch (Exception ex) { exceptionHandler.accept(ex); - dataPoint.setAttribute(updateErrorKey, true); + setUnreliableDataPoint(updateErrorKey, dataPoint); } } } From a1643187acc95600f63d211683a58cbe3bdfacc5 Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Mon, 6 Nov 2023 20:57:51 +0100 Subject: [PATCH 02/63] #2755 Signaling the Data Source that has a problem - corrected signaling on graphical views --- WebContent/WEB-INF/snippet/warningIcon.jsp | 9 +++++++++ WebContent/WEB-INF/tags/pointComponent.tag | 4 ++-- WebContent/resources/view.js | 1 + src/com/serotonin/mango/web/dwr/ViewDwr.java | 1 + .../serotonin/mango/web/dwr/beans/BasePointState.java | 9 +++++++++ 5 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 WebContent/WEB-INF/snippet/warningIcon.jsp diff --git a/WebContent/WEB-INF/snippet/warningIcon.jsp b/WebContent/WEB-INF/snippet/warningIcon.jsp new file mode 100644 index 0000000000..b9c16068b0 --- /dev/null +++ b/WebContent/WEB-INF/snippet/warningIcon.jsp @@ -0,0 +1,9 @@ +<%@ include file="/WEB-INF/snippet/common.jsp" %> + + + + + + + + \ No newline at end of file diff --git a/WebContent/WEB-INF/tags/pointComponent.tag b/WebContent/WEB-INF/tags/pointComponent.tag index fbba850231..5cf5d997dd 100644 --- a/WebContent/WEB-INF/tags/pointComponent.tag +++ b/WebContent/WEB-INF/tags/pointComponent.tag @@ -58,7 +58,7 @@
@@ -74,7 +74,7 @@
diff --git a/WebContent/resources/view.js b/WebContent/resources/view.js index 3ca1aac54e..ef91abc5b9 100644 --- a/WebContent/resources/view.js +++ b/WebContent/resources/view.js @@ -62,6 +62,7 @@ mango.view.setMessages = function(state) { var warningNode = $("c"+ state.id +"Warning"); if (warningNode && state.messages != null) { $set("c"+ state.id +"Messages", state.messages); + $set("c"+ state.id +"WarningIcon", state.warningIcon); if (state.messages) show(warningNode); else diff --git a/src/com/serotonin/mango/web/dwr/ViewDwr.java b/src/com/serotonin/mango/web/dwr/ViewDwr.java index c665fd184e..34f7435381 100644 --- a/src/com/serotonin/mango/web/dwr/ViewDwr.java +++ b/src/com/serotonin/mango/web/dwr/ViewDwr.java @@ -303,6 +303,7 @@ private ViewComponentState preparePointComponentState(PointComponent pointCompon } state.setInfo(generateContent(request, "infoContent.jsp", model)); + state.setWarningIcon(generateContent(request, "warningIcon.jsp", model)); setMessages(state, request, "warningContent", model); return state; diff --git a/src/com/serotonin/mango/web/dwr/beans/BasePointState.java b/src/com/serotonin/mango/web/dwr/beans/BasePointState.java index 6075e85533..62fb08a070 100644 --- a/src/com/serotonin/mango/web/dwr/beans/BasePointState.java +++ b/src/com/serotonin/mango/web/dwr/beans/BasePointState.java @@ -25,6 +25,7 @@ abstract public class BasePointState implements Cloneable { private String change; private String chart; private String messages; + private String warningIcon; public String getId() { return id; @@ -58,6 +59,14 @@ public void setMessages(String messages) { this.messages = messages; } + public String getWarningIcon() { + return warningIcon; + } + + public void setWarningIcon(String warningIcon) { + this.warningIcon = warningIcon; + } + public void removeEqualValue(BasePointState that) { if (StringUtils.isEqual(change, that.change)) change = null; From 5952f6a9fd7f912cd30889322be67ab934ac6161 Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Tue, 7 Nov 2023 14:29:06 +0100 Subject: [PATCH 03/63] #2755 Signaling the Data Source that has a problem - corrected signaling on graphical views --- WebContent/WEB-INF/tags/pointComponent.tag | 2 +- WebContent/resources/view.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/WebContent/WEB-INF/tags/pointComponent.tag b/WebContent/WEB-INF/tags/pointComponent.tag index 5cf5d997dd..940959daea 100644 --- a/WebContent/WEB-INF/tags/pointComponent.tag +++ b/WebContent/WEB-INF/tags/pointComponent.tag @@ -74,7 +74,7 @@
diff --git a/WebContent/resources/view.js b/WebContent/resources/view.js index ef91abc5b9..43a786a319 100644 --- a/WebContent/resources/view.js +++ b/WebContent/resources/view.js @@ -62,7 +62,10 @@ mango.view.setMessages = function(state) { var warningNode = $("c"+ state.id +"Warning"); if (warningNode && state.messages != null) { $set("c"+ state.id +"Messages", state.messages); - $set("c"+ state.id +"WarningIcon", state.warningIcon); + var warningIconNode = $("c"+ state.id +"WarningIcon"); + if(warningIconNode) { + $set("c"+ state.id +"WarningIcon", state.warningIcon); + } if (state.messages) show(warningNode); else From 2b795510a9ed6e65a3441b929fc1216a69888861 Mon Sep 17 00:00:00 2001 From: Kamil Date: Thu, 1 Feb 2024 01:34:04 +0100 Subject: [PATCH 04/63] #2755 Signaling the Data Source that has a problem - fixed feature refresh point value --- WebContent/WEB-INF/snippet/warningContent.jsp | 2 +- WebContent/WEB-INF/snippet/watchListMessages.jsp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/WebContent/WEB-INF/snippet/warningContent.jsp b/WebContent/WEB-INF/snippet/warningContent.jsp index 27bf7730e9..4443f841fb 100644 --- a/WebContent/WEB-INF/snippet/warningContent.jsp +++ b/WebContent/WEB-INF/snippet/warningContent.jsp @@ -37,7 +37,7 @@ - + diff --git a/WebContent/WEB-INF/snippet/watchListMessages.jsp b/WebContent/WEB-INF/snippet/watchListMessages.jsp index 90701dae0f..ff8f1e543f 100644 --- a/WebContent/WEB-INF/snippet/watchListMessages.jsp +++ b/WebContent/WEB-INF/snippet/watchListMessages.jsp @@ -25,7 +25,7 @@ -
+
From 7ced95097bd112d1e6eb7c4e839132714c00bc34 Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Fri, 9 Feb 2024 21:17:48 +0100 Subject: [PATCH 05/63] #2755 signaling the data source that has a problem: - DataPointUnreliableUtilsTest.java; - use methods returnToNormal and raiseEvent from DataSourceRT; - added methods: LoggingUtils.info, LoggingUtils.dataPointInfo, LoggingUtils.dataPointRtInfo, PollingDataSource.getDataPoints, EventDataSource.getDataPoints, DataSourceRT.getDataPoints; --- .../asciiFile/ASCIIFileDataSource.java | 5 +- .../asciiSerial/ASCIISerialDataSource.java | 6 +- .../rt/dataSource/dnp3/Dnp3DataSource.java | 14 +- .../rt/dataSource/dnp3/Dnp3IpDataSource.java | 8 +- .../dataSource/dnp3/Dnp3SerialDataSource.java | 6 +- .../DrStorageHt5bDataSource.java | 7 +- .../dataSource/iec101/IEC101DataSource.java | 16 +- .../nodaves7/NodaveS7DataSource.java | 8 +- .../rt/dataSource/opc/OPCDataSource.java | 12 +- .../vo/dataSource/dnp3/Dnp3DataSourceVO.java | 3 + .../radiuino/RadiuinoEventDataSource.java | 3 +- .../radiuino/RadiuinoPollingDataSource.java | 3 +- .../serotonin/mango/rt/RuntimeManager.java | 36 ++- .../mango/rt/dataImage/DataPointRT.java | 2 +- .../dataSource/DataPointUnreliableUtils.java | 39 ++-- .../mango/rt/dataSource/DataSourceRT.java | 40 +++- .../mango/rt/dataSource/EventDataSource.java | 5 + .../rt/dataSource/PollingDataSource.java | 5 + .../bacnet/BACnetIPDataSourceRT.java | 40 ++-- .../dataSource/galil/GalilDataSourceRT.java | 12 +- .../http/HttpRetrieverDataSourceRT.java | 10 +- .../rt/dataSource/jmx/JmxDataSourceRT.java | 27 +-- .../rt/dataSource/mbus/MBusDataSourceRT.java | 1 + .../rt/dataSource/meta/MetaDataSourceRT.java | 22 +- .../dataSource/meta/MetaPointLocatorRT.java | 10 +- .../dataSource/modbus/ModbusDataSource.java | 31 +-- .../onewire/OneWireDataSourceRT.java | 6 +- .../openv4j/OpenV4JDataSourceRT.java | 6 +- .../pachube/PachubeDataSourceRT.java | 19 +- .../rt/dataSource/pop3/Pop3DataSourceRT.java | 2 +- .../rt/dataSource/snmp/SnmpDataSourceRT.java | 22 +- .../rt/dataSource/sql/SqlDataSourceRT.java | 6 +- .../viconics/ViconicsDataSourceRT.java | 33 +-- .../serotonin/mango/util/LoggingUtils.java | 25 ++ .../ds/messaging/MessagingDataSourceRT.java | 46 ++-- .../channel/InitMessagingChannels.java | 3 +- .../channel/UpdatePointValueConsumer.java | 13 +- .../amqp/client/AmqpChannelFactory.java | 12 +- .../amqp/client/AmqpMessagingChannels.java | 4 +- .../mqtt/client/MqttMessagingChannels.java | 8 +- .../messaging/service/MessagingService.java | 3 +- .../service/MessagingServiceImpl.java | 5 +- .../DataPointUnreliableUtilsTest.java | 217 ++++++++++++++++++ 43 files changed, 544 insertions(+), 257 deletions(-) create mode 100644 test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java diff --git a/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java b/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java index 3a5c220aa5..38112ad3d0 100644 --- a/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java @@ -58,7 +58,7 @@ protected void doPoll(long time) { } catch (Exception e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", - vo.getName(), e.getMessage())); + vo.getName(), e.getMessage()), dataPoint); timestamp = time; } @@ -66,10 +66,11 @@ protected void doPoll(long time) { dataPoint.updatePointValue(new PointValueTime(value, timestamp)); + returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", vo - .getName(), e.getMessage())); + .getName(), e.getMessage()), dataPoint); e.printStackTrace(); } diff --git a/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java b/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java index 6a1968f973..15f13e0fe0 100644 --- a/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java @@ -93,6 +93,7 @@ protected void doPoll(long time) { new LocalizableMessage("event.exception2", vo.getName(), "Sem dados disponíveis !")); } else if (getInSerialStream().available() > 0) { + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); byte[] readBuffer = new byte[vo.getBufferSize()]; try { @@ -176,7 +177,7 @@ protected void doPoll(long time) { new LocalizableMessage( "event.exception2", vo .getName(), e - .getMessage())); + .getMessage()), dataPoint); timestamp = time; } @@ -184,10 +185,11 @@ protected void doPoll(long time) { dataPoint.updatePointValue(new PointValueTime( value, timestamp)); + returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", - vo.getName(), e.getMessage())); + vo.getName(), e.getMessage()), dataPoint); // e.printStackTrace(); } diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java index 519fb07375..84eaf6dd8b 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java @@ -21,14 +21,13 @@ import com.serotonin.messaging.TimeoutException; import com.serotonin.web.i18n.LocalizableMessage; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; - public class Dnp3DataSource extends PollingDataSource { private final Log LOG = LogFactory.getLog(Dnp3DataSource.class); public static final int POINT_READ_EXCEPTION_EVENT = 1; public static final int DATA_SOURCE_EXCEPTION_EVENT = 2; + public static final int POINT_WRITE_EXCEPTION_EVENT = 3; private DNP3Master dnp3Master; private final Dnp3DataSourceVO vo; @@ -46,9 +45,7 @@ protected void doPoll(long time) { try { dnp3Master.doPoll(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); - resetUnreliableDataPoints(dataPoints); } catch (Exception e) { - setUnreliableDataPoints(dataPoints); LOG.warn(e.getMessage(), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", vo.getName(), e @@ -86,9 +83,8 @@ public void terminate() { super.terminate(); try { dnp3Master.terminate(); - resetUnreliableDataPoints(dataPoints); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Exception e) { - setUnreliableDataPoints(dataPoints); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); @@ -114,9 +110,11 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, dnp3Master .sendAnalogCommand(index, valueTime.getIntegerValue()); } - resetUnreliableDataPoint(dataPoint); + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Exception e) { - setUnreliableDataPoint(dataPoint); + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, new Date().getTime(), true, + new LocalizableMessage("event.exception2", vo.getName(), e + .getMessage()), dataPoint); LOG.error(e.getMessage(), e); } } diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java index daafdc9da6..5144d7714f 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java @@ -1,6 +1,5 @@ package br.org.scadabr.rt.dataSource.dnp3; -import java.util.Date; import br.org.scadabr.vo.dataSource.dnp3.Dnp3IpDataSourceVO; @@ -8,8 +7,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; - public class Dnp3IpDataSource extends Dnp3DataSource { private static final Log LOG = LogFactory.getLog(Dnp3IpDataSource.class); @@ -29,11 +26,10 @@ public void initialize() { configuration.getSlaveAddress(), configuration.getHost(), configuration.getPort(), configuration .getStaticPollPeriods()); - resetUnreliableDataPoints(dataPoints); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Exception e) { - setUnreliableDataPoints(dataPoints); LOG.error(e.getMessage(), e); - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("event.exception2", configuration .getName(), e.getMessage())); } diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java index 45d5c7a9cd..35de97de10 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java @@ -11,9 +11,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoints; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.setUnreliableDataPoints; - public class Dnp3SerialDataSource extends Dnp3DataSource { private static final Log LOG = LogFactory.getLog(Dnp3SerialDataSource.class); @@ -33,9 +30,8 @@ public void initialize() { configuration.getSlaveAddress(), configuration .getCommPortId(), configuration.getBaudRate(), configuration.getStaticPollPeriods()); - resetUnreliableDataPoints(dataPoints); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Exception e) { - setUnreliableDataPoints(dataPoints); LOG.error(e.getMessage(), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", configuration diff --git a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java index c72fa89441..af5afc18d9 100644 --- a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java @@ -1,5 +1,6 @@ package br.org.scadabr.rt.dataSource.drStorageHt5b; +import com.serotonin.mango.util.LoggingUtils; import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; @@ -89,12 +90,12 @@ protected void doPoll(long time) { dataPoint.updatePointValue(new PointValueTime( hum, System.currentTimeMillis())); } - + returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", - vo.getName(), e.getMessage())); - e.printStackTrace(); + vo.getName(), e.getMessage()), dataPoint); + LOG.error(LoggingUtils.exceptionInfo(e) + " - " + LoggingUtils.dataSourceInfo(this), e); } } diff --git a/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java b/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java index 9a324cf954..e9538c3553 100644 --- a/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java @@ -4,6 +4,7 @@ import java.util.Date; import java.util.List; +import com.serotonin.mango.util.LoggingUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -40,10 +41,10 @@ protected void doPoll(long time) { try { iec101Master.doPoll(); } catch (Exception e) { - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); - e.printStackTrace(); + LOG.error(LoggingUtils.info(e, this), e); } for (DataPointRT dataPoint : dataPoints) { @@ -85,11 +86,12 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, iec101Master.setPointCommand(ioa, select, qualifier, valueTime .getIntegerValue()); } + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Exception e) { - raiseEvent(POINT_WRITE_EXCEPTION_EVENT, new Date().getTime(), true, + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("event.exception2", vo.getName(), e - .getMessage())); - e.printStackTrace(); + .getMessage()), dataPoint); + LOG.error(LoggingUtils.info(e, this, dataPoint), e); } } @@ -116,7 +118,7 @@ protected void initialize(IEC101Master iec101Master) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); - e.printStackTrace(); + LOG.error(LoggingUtils.info(e, this), e); } super.initialize(); } @@ -130,7 +132,7 @@ public void terminate() { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); - e.printStackTrace(); + LOG.error(LoggingUtils.info(e, this), e); } } diff --git a/src/br/org/scadabr/rt/dataSource/nodaves7/NodaveS7DataSource.java b/src/br/org/scadabr/rt/dataSource/nodaves7/NodaveS7DataSource.java index e3dc448a08..54cd7cb2fc 100644 --- a/src/br/org/scadabr/rt/dataSource/nodaves7/NodaveS7DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/nodaves7/NodaveS7DataSource.java @@ -7,6 +7,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.serotonin.mango.util.LoggingUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -66,7 +67,7 @@ protected void doPoll(long time) { } catch (Exception e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", - vo.getName(), e.getMessage())); + vo.getName(), e.getMessage()), dataPoint); timestamp = time; } @@ -74,14 +75,15 @@ protected void doPoll(long time) { dataPoint.updatePointValue(new PointValueTime(value, timestamp)); + returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { raiseEvent( POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", vo - .getName(), e.getMessage())); - e.printStackTrace(); + .getName(), e.getMessage()), dataPoint); + LOG.error(LoggingUtils.info(e, this, dataPoint), e); } } diff --git a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java index b2485dcabc..47fb56cd70 100644 --- a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.logging.Level; +import com.serotonin.mango.util.LoggingUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jinterop.dcom.common.JISystem; @@ -53,7 +54,7 @@ protected void doPoll(long time) { try { if (timeoutCount >= timeoutsToReconnect) { - System.out.println("[OPC] Trying to reconnect !"); + LOG.error("[OPC] Trying to reconnect ! :" + LoggingUtils.dataSourceInfo(this)); timeoutCount = 0; initialize(); } else { @@ -70,7 +71,7 @@ protected void doPoll(long time) { new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); timeoutCount++; - System.out.println("[OPC] Poll Failed !"); + LOG.error("[OPC] Poll Failed ! :" + LoggingUtils.info(e, this)); } for (DataPointRT dataPoint : dataPoints) { @@ -85,10 +86,11 @@ protected void doPoll(long time) { dataPointVO.getDataTypeId()); dataPoint .updatePointValue(new PointValueTime(mangoValue, time)); + returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", - vo.getName(), e.getMessage())); + vo.getName(), e.getMessage()), dataPoint); } } } @@ -116,8 +118,8 @@ else if (dataPoint.getDataTypeId() == DataTypes.MULTISTATE) System.currentTimeMillis(), true, new LocalizableMessage("event.exception2", vo.getName(), e - .getMessage())); - e.printStackTrace(); + .getMessage()), dataPoint); + LOG.error(LoggingUtils.info(e, this, dataPoint), e); } } diff --git a/src/br/org/scadabr/vo/dataSource/dnp3/Dnp3DataSourceVO.java b/src/br/org/scadabr/vo/dataSource/dnp3/Dnp3DataSourceVO.java index dcb5a37649..3f8f3a8ef4 100644 --- a/src/br/org/scadabr/vo/dataSource/dnp3/Dnp3DataSourceVO.java +++ b/src/br/org/scadabr/vo/dataSource/dnp3/Dnp3DataSourceVO.java @@ -33,6 +33,9 @@ protected void addEventTypes(List eventTypes) { eventTypes.add(createEventType( Dnp3DataSource.DATA_SOURCE_EXCEPTION_EVENT, new LocalizableMessage("event.ds.dataSource"))); + eventTypes.add(createEventType( + Dnp3DataSource.POINT_WRITE_EXCEPTION_EVENT, + new LocalizableMessage("event.ds.pointWrite"))); } private static final ExportCodes EVENT_CODES = new ExportCodes(); diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java index 89fd53225b..54b5bc0840 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java @@ -326,6 +326,7 @@ private void pacoteRecebido() { .parsePacoteRadiuino(time, pacote, dataPointVO); if (pointValueTime != null) dataPoint.updatePointValue(pointValueTime); + returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { LOG.error("Erro ao fazer o parse dos dados.", e); raiseEvent( @@ -333,7 +334,7 @@ private void pacoteRecebido() { time, true, new LocalizableMessage("event.exception2", vo - .getName(), e.getMessage())); + .getName(), e.getMessage()), dataPoint); } } diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java index ab30f6a672..9095643edc 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java @@ -415,6 +415,7 @@ private void pacoteRecebido() { .parsePacoteRadiuino(time, pacote, dataPointVO); if (pointValueTime != null) dataPoint.updatePointValue(pointValueTime); + returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { LOG.error("Erro ao fazer o parse dos dados.", e); raiseEvent( @@ -422,7 +423,7 @@ private void pacoteRecebido() { time, true, new LocalizableMessage("event.exception2", vo - .getName(), e.getMessage())); + .getName(), e.getMessage()), dataPoint); } } diff --git a/src/com/serotonin/mango/rt/RuntimeManager.java b/src/com/serotonin/mango/rt/RuntimeManager.java index 8eb4ef7945..a1b28a38dd 100644 --- a/src/com/serotonin/mango/rt/RuntimeManager.java +++ b/src/com/serotonin/mango/rt/RuntimeManager.java @@ -21,11 +21,13 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Predicate; import java.util.stream.Collectors; import com.serotonin.db.IntValuePair; import com.serotonin.mango.db.dao.*; import com.serotonin.mango.rt.dataImage.*; +import com.serotonin.mango.rt.dataSource.meta.MetaPointLocatorRT; import com.serotonin.mango.rt.event.*; import com.serotonin.mango.rt.event.schedule.ResetDailyLimitSendingEventRT; import com.serotonin.mango.rt.event.schedule.ScheduledExecuteInactiveEventRT; @@ -1074,12 +1076,8 @@ private void startPoints() { DataPointService dataPointService = new DataPointService(); List allPoints = dataPointService.getDataPoints(null, true); - List nonMetaDataPoints = allPoints.stream() - .filter(a -> !(a.getPointLocator() instanceof MetaPointLocatorVO)) - .collect(Collectors.toList()); - List metaDataPoints = allPoints.stream() - .filter(a -> a.getPointLocator() instanceof MetaPointLocatorVO) - .collect(Collectors.toList()); + List nonMetaDataPoints = filterDataPoints(allPoints, a -> a.getPointLocator() instanceof MetaPointLocatorVO); + List metaDataPoints = filterDataPoints(allPoints, a -> !(a.getPointLocator() instanceof MetaPointLocatorVO)); run(nonMetaDataPoints); @@ -1141,4 +1139,30 @@ private void collectMetaDataPointsFromContext(Set toCheck, List getRunningMetaDataPoints(int dataPointInContextId) { + Map dataPoints = new HashMap<>(this.dataPoints); + return filterRunningDataPoints(new ArrayList<>(dataPoints.values()), dataPoint -> + Objects.nonNull(dataPoint.getPointLocator()) + && dataPoint.getPointLocator() instanceof MetaPointLocatorRT + && Objects.nonNull((((MetaPointLocatorRT) dataPoint.getPointLocator()).getPointLocatorVO())) + && Objects.nonNull((((MetaPointLocatorRT) dataPoint.getPointLocator()).getPointLocatorVO()).getContext()) + && (((MetaPointLocatorRT) dataPoint.getPointLocator()).getPointLocatorVO()).getContext().stream() + .map(IntValuePair::getKey) + .collect(Collectors.toList()) + .contains(dataPointInContextId)); + } + + private static List filterRunningDataPoints(List dataPoints, Predicate filter) { + return dataPoints.stream() + .filter(filter) + .collect(Collectors.toList()); + } + + private static List filterDataPoints(List dataPoints, Predicate filter) { + return dataPoints.stream() + .filter(filter) + .collect(Collectors.toList()); + } + } diff --git a/src/com/serotonin/mango/rt/dataImage/DataPointRT.java b/src/com/serotonin/mango/rt/dataImage/DataPointRT.java index 61971a2f4b..87ddbdd0d6 100644 --- a/src/com/serotonin/mango/rt/dataImage/DataPointRT.java +++ b/src/com/serotonin/mango/rt/dataImage/DataPointRT.java @@ -52,7 +52,7 @@ import static org.scada_lts.utils.PointValueStateUtils.isSetPointHandler; -public class DataPointRT implements IDataPoint, ILifecycle, TimeoutClient, ScadaWebSockets { +public class DataPointRT implements IDataPoint, ILifecycle, TimeoutClient, ScadaWebSockets, IDataPointRT { private static final Log LOG = LogFactory.getLog(DataPointRT.class); private static final PvtTimeComparator pvtTimeComparator = new PvtTimeComparator(); diff --git a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java index 572513071b..b09bd2acda 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java +++ b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java @@ -1,8 +1,11 @@ package com.serotonin.mango.rt.dataSource; +import com.serotonin.mango.Common; import com.serotonin.mango.rt.dataImage.DataPointRT; +import java.util.Collections; import java.util.List; +import java.util.function.*; public final class DataPointUnreliableUtils { @@ -10,31 +13,39 @@ public final class DataPointUnreliableUtils { private DataPointUnreliableUtils() {} + public static void setUnreliableDataPoints(List dataPoints) { - for (DataPointRT dp : dataPoints) { - setUnreliableDataPoint(dp); - } + unreliable(dataPoints, DataPointUnreliableUtils::setAttributes, Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, true); } - public static void resetUnreliableDataPoints(List dataPoints) { - for (DataPointRT dp : dataPoints) { - resetUnreliableDataPoint(dp); - } + public static void setUnreliableDataPoint(DataPointRT dataPoint) { + unreliable(Collections.singletonList(dataPoint), DataPointUnreliableUtils::setAttributes, Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, true); } - public static void setUnreliableDataPoint(DataPointRT dataPoint) { - setUnreliableDataPoint(ATTR_UNRELIABLE_KEY, dataPoint); + public static void resetUnreliableDataPoints(List dataPoints) { + unreliable(dataPoints, DataPointUnreliableUtils::setAttributes, Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, false); } public static void resetUnreliableDataPoint(DataPointRT dataPoint) { - resetUnreliableDataPoint(ATTR_UNRELIABLE_KEY, dataPoint); + unreliable(Collections.singletonList(dataPoint), DataPointUnreliableUtils::setAttributes, Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, false); } - public static void setUnreliableDataPoint(String key, DataPointRT dataPoint) { - dataPoint.setAttribute(key, true); + private static void unreliable(List dataPoints, BiConsumer, Boolean> setList, + IntFunction> getData, boolean unreliable) { + setList.accept(dataPoints, unreliable); + for(DataPointRT dataPoint: dataPoints) { + List metaDataPoints = getData.apply(dataPoint.getId()); + setList.accept(metaDataPoints, unreliable); + } + } + + private static void setAttributes(List dataPoints, boolean unreliable) { + for (DataPointRT dp : dataPoints) { + setAttribute(dp, unreliable); + } } - public static void resetUnreliableDataPoint(String key, DataPointRT dataPoint) { - dataPoint.setAttribute(key, false); + private static void setAttribute(DataPointRT dataPoint, boolean unreliable) { + dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, unreliable); } } diff --git a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java index 317201a178..4c19a25a0c 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java @@ -35,6 +35,8 @@ import com.serotonin.util.ILifecycle; import com.serotonin.web.i18n.LocalizableMessage; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; + /** * Data sources are things that produce data for consumption of this system. Anything that houses, creates, manages, or * otherwise can get data to Mango can be considered a data source. As such, this interface can more precisely be @@ -127,6 +129,8 @@ public void removeDataPoint(DataPointRT dataPoint) { abstract public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPointSource source); + protected abstract List getDataPoints(); + public void relinquish(@SuppressWarnings("unused") DataPointRT dataPoint) { throw new ShouldNeverHappenException("not implemented in " + getClass()); } @@ -144,7 +148,7 @@ public static void raiseEvent(String describe, DataSourceVO vo) { Common.ctx.getEventManager().raiseEvent(dset, new Date().getTime(), true, dset.getAlarmLevel(), message, context); } - protected void raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message) { + private void _raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message) { message = new LocalizableMessage("event.ds", vo.getName(), message); DataSourceEventType type = getEventType(eventId); @@ -154,11 +158,43 @@ protected void raiseEvent(int eventId, long time, boolean rtn, LocalizableMessag Common.ctx.getEventManager().raiseEvent(type, time, rtn, type.getAlarmLevel(), message, context); } - protected void returnToNormal(int eventId, long time) { + private void _returnToNormal(int eventId, long time) { DataSourceEventType type = getEventType(eventId); Common.ctx.getEventManager().returnToNormal(type, time); } + protected void raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message) { + _raiseEvent(eventId, time, rtn, message); + List dataPoints = getDataPoints(); + setUnreliableDataPoints(dataPoints); + } + + protected void raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message, DataPointRT dataPoint) { + _raiseEvent(eventId, time, rtn, message); + setUnreliableDataPoint(dataPoint); + } + + protected void raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message, List dataPoints) { + _raiseEvent(eventId, time, rtn, message); + setUnreliableDataPoints(dataPoints); + } + + protected void returnToNormal(int eventId, long time) { + _returnToNormal(eventId, time); + List dataPoints = getDataPoints(); + resetUnreliableDataPoints(dataPoints); + } + + protected void returnToNormal(int eventId, long time, DataPointRT dataPoint) { + _returnToNormal(eventId, time); + resetUnreliableDataPoint(dataPoint); + } + + protected void returnToNormal(int eventId, long time, List dataPoints) { + _returnToNormal(eventId, time); + resetUnreliableDataPoints(dataPoints); + } + protected DataSourceEventType getEventType(int eventId) { for (DataSourceEventType et : eventTypes) { if (et.getDataSourceEventTypeId() == eventId) diff --git a/src/com/serotonin/mango/rt/dataSource/EventDataSource.java b/src/com/serotonin/mango/rt/dataSource/EventDataSource.java index 44bee9c9f5..21a7cf3855 100644 --- a/src/com/serotonin/mango/rt/dataSource/EventDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/EventDataSource.java @@ -53,4 +53,9 @@ public void removeDataPoint(DataPointRT dataPoint) { public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPointSource source) { // Typically, event based data sources cannot set point values, so don't make subclasses implement this. } + + @Override + protected List getDataPoints() { + return dataPoints; + } } diff --git a/src/com/serotonin/mango/rt/dataSource/PollingDataSource.java b/src/com/serotonin/mango/rt/dataSource/PollingDataSource.java index 778890c7c6..14698136c6 100644 --- a/src/com/serotonin/mango/rt/dataSource/PollingDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/PollingDataSource.java @@ -138,4 +138,9 @@ public void joinTermination() { } } } + + @Override + protected List getDataPoints() { + return dataPoints; + } } diff --git a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java index 859eb22f2a..51e148c9f4 100644 --- a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java @@ -90,7 +90,8 @@ import com.serotonin.web.i18n.LocalizableMessage; import com.serotonin.web.taglib.DateFunctions; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoint; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.setUnreliableDataPoint; /** * @author Matthew Lohbihler @@ -137,10 +138,8 @@ public void initialize() { // Deactivate any existing event. returnToNormal(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis()); - resetUnreliableDataPoints(dataPoints); } catch (Exception e) { - setUnreliableDataPoints(dataPoints); raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); return; @@ -151,10 +150,9 @@ public void initialize() { // Let everyone know we're here. try { localDevice.sendBroadcast(localDevice.getIAm()); - resetUnreliableDataPoints(dataPoints); + returnToNormal(); } catch (BACnetException e) { - setUnreliableDataPoints(dataPoints); fireMessageExceptionEvent("event.bacnet.iamError", e.getMessage()); } @@ -169,10 +167,8 @@ public void initialize() { catch (InterruptedException e) { // no op } - resetUnreliableDataPoints(dataPoints); } catch (BACnetException e) { - setUnreliableDataPoints(dataPoints); fireMessageExceptionEvent("event.bacnet.whoisError", e.getMessage()); } @@ -228,10 +224,9 @@ public void addDataPoint(DataPointRT dataPoint) { // Send a whois to get remote device data. try { localDevice.sendUnconfirmed(address, null, new WhoIsRequest()); - resetUnreliableDataPoint(dataPoint); + returnToNormal(dataPoint); } catch (BACnetException e) { - setUnreliableDataPoint(dataPoint); fireMessageExceptionEvent("event.bacnet.whoisPoint", dataPoint.getVO().getName(), e.getMessage()); disablePoint(dataPoint); return; @@ -272,7 +267,6 @@ public void addDataPoint(DataPointRT dataPoint) { } if (d == null) { - setUnreliableDataPoint(dataPoint); // If we still don't have the device, call it in. fireDeviceExceptionEvent("event.bacnet.deviceError", address.toIpString()); disablePoint(dataPoint); @@ -286,7 +280,7 @@ public void addDataPoint(DataPointRT dataPoint) { } super.addDataPoint(dataPoint); - resetUnreliableDataPoint(dataPoint); + returnToNormal(dataPoint); } } @@ -404,16 +398,15 @@ void pollDevice(RemoteDevice d, List points, long time) { try { // Send the read request. PropertyValues values = localDevice.readProperties(d, refs); - resetUnreliableDataPoints(points); // Dereference the property values back into the points. for (DataPointRT dp : points) { BACnetIPPointLocatorRT locator = dp.getPointLocator(); Encodable encodable = values.getNoErrorCheck(locator.getOid(), locator.getPid()); dereferencePoint(dp, encodable, time); + returnToNormal(dp); } } catch (BACnetException e) { - setUnreliableDataPoints(points); fireMessageExceptionEvent("event.bacnet.readDevice", d.getAddress().toIpString(), e.getMessage()); } } @@ -428,6 +421,7 @@ public void forcePointRead(DataPointRT dataPoint) { ReadPropertyRequest req = new ReadPropertyRequest(locator.getOid(), locator.getPid()); ReadPropertyAck ack = (ReadPropertyAck) localDevice.send(d, req); dereferencePoint(dataPoint, ack.getValue(), System.currentTimeMillis()); + returnToNormal(dataPoint); } catch (BACnetException e) { fireMessageExceptionEvent("event.bacnet.readDevice", d.getAddress().toIpString(), e.getMessage()); @@ -436,16 +430,14 @@ public void forcePointRead(DataPointRT dataPoint) { private void dereferencePoint(DataPointRT dp, Encodable encodable, long time) { if (encodable == null) { - setUnreliableDataPoint(dp); fireDeviceExceptionEvent("event.bacnet.readError", dp.getVO().getName(), "no value returned"); } else if (encodable instanceof BACnetError) { - setUnreliableDataPoint(dp); fireDeviceExceptionEvent("event.bacnet.readError", dp.getVO().getName(), ((BACnetError) encodable).getErrorCode()); } else { MangoValue value = encodableToValue(encodable, dp.getDataTypeId()); dp.updatePointValue(new PointValueTime(value, time)); - resetUnreliableDataPoint(dp); + returnToNormal(dp); } } @@ -464,10 +456,9 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime pvt, SetPointSou new UnsignedInteger(locator.getWritePriority())); localDevice.send(locator.getRemoteDevice(), writeRequest); dataPoint.setPointValue(pvt, source); - resetUnreliableDataPoint(dataPoint); + returnToNormal(dataPoint); } catch (Throwable t) { - setUnreliableDataPoint(dataPoint); fireMessageExceptionEvent("event.setPointFailed", t.getMessage()); } } @@ -492,7 +483,8 @@ public void relinquish(DataPointRT dataPoint) { } } - List getDataPoints() { + @Override + protected List getDataPoints() { return dataPoints; } @@ -641,13 +633,11 @@ boolean sendCovSubscription(DataPointRT dataPoint, boolean unsubscribe) { try { sendCovSubscriptionImpl(locator.getRemoteDevice(), locator.getOid(), locator.getCovId(), unsubscribe); - resetUnreliableDataPoint(dataPoint); } catch (BACnetException e) { // If we are unsubscribing a failure doesn't really matter since the lease will expire eventually anyway, // so ignore. if (!unsubscribe) { - setUnreliableDataPoint(dataPoint); fireMessageExceptionEvent("event.bacnet.covFailed", locator.getRemoteDevice().getAddress().toIpString(), e.getMessage()); disablePoint(dataPoint); @@ -687,6 +677,14 @@ private void fireDeviceExceptionEvent(String key, Object... args) { raiseEvent(DEVICE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, args)); } + private void returnToNormal() { + returnToNormal(DEVICE_EXCEPTION_EVENT, System.currentTimeMillis()); + } + + private void returnToNormal(DataPointRT dataPoint) { + returnToNormal(DEVICE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); + } + private void disablePoint(DataPointRT dataPoint) { DataPointVO dataPointVO = dataPoint.getVO(); dataPointVO.setEnabled(false); diff --git a/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java index 9934955ba1..6f8ffca681 100644 --- a/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java @@ -184,11 +184,11 @@ synchronized public void setPointValue(DataPointRT dataPoint, PointValueTime val } catch (IOException e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( - "event.galil.setPointFailed", dataPoint.getVO().getName(), e.getMessage())); + "event.galil.setPointFailed", dataPoint.getVO().getName(), e.getMessage()), dataPoint); LOG.debug("Error while initializing data source", e); return; } - returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } GalilPointLocatorRT locator = dataPoint.getPointLocator(); @@ -196,14 +196,14 @@ synchronized public void setPointValue(DataPointRT dataPoint, PointValueTime val GalilRequest request = locator.getSetRequest(valueTime.getValue()); if (request == null) raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage( - "event.galil.setRequest", dataPoint.getVO().getName(), valueTime.getValue())); + "event.galil.setRequest", dataPoint.getVO().getName(), valueTime.getValue()), dataPoint); else { try { GalilResponse response = (GalilResponse) conn.send(request); if (response.isErrorResponse()) raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage( - "event.galil.setResponse", dataPoint.getVO().getName())); + "event.galil.setResponse", dataPoint.getVO().getName()), dataPoint); else { try { // Update the data image with the new value. @@ -217,13 +217,13 @@ synchronized public void setPointValue(DataPointRT dataPoint, PointValueTime val catch (LocalizableException e) { raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage("event.galil.parsingError", dataPoint.getVO().getName(), - response.getResponseData())); + response.getResponseData()), dataPoint); } } } catch (IOException e) { raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage( - "event.galil.sendError", dataPoint.getVO().getName(), e.getMessage())); + "event.galil.sendError", dataPoint.getVO().getName(), e.getMessage()), dataPoint); } } } diff --git a/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java index 445a8ab405..556a8ad05a 100644 --- a/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java @@ -41,8 +41,6 @@ import java.util.Collections; import java.util.List; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; - /** * @author Matthew Lohbihler */ @@ -71,9 +69,8 @@ public HttpRetrieverDataSourceRT(HttpRetrieverDataSourceVO vo, StopSleepRT stopS @Override public void removeDataPoint(DataPointRT dataPoint) { - returnToNormal(PARSE_EXCEPTION_EVENT, System.currentTimeMillis()); + returnToNormal(PARSE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); super.removeDataPoint(dataPoint); - resetUnreliableDataPoint(dataPoint); } @Override @@ -86,9 +83,7 @@ protected void doPoll(long time) { String data; try { data = getData(vo.getUrl(), vo.getTimeoutSeconds(), vo.getRetries(), vo.isStop(), vo.getReactivation(), vo.getStaticHeaders()); - resetUnreliableDataPoints(dataPoints); } catch (Exception e) { - setUnreliableDataPoints(dataPoints); LocalizableMessage lm; if (e instanceof LocalizableException) lm = ((LocalizableException) e).getLocalizableMessage(); @@ -118,17 +113,14 @@ protected void doPoll(long time) { // Save the new value dp.updatePointValue(new PointValueTime(value, valueTime)); - resetUnreliableDataPoint(dp); } catch (NoMatchException e) { if (!locator.isIgnoreIfMissing()) { if (parseErrorMessage == null) parseErrorMessage = e.getLocalizableMessage(); - setUnreliableDataPoint(dp); } } catch (LocalizableException e) { if (parseErrorMessage == null) parseErrorMessage = e.getLocalizableMessage(); - setUnreliableDataPoint(dp); } } diff --git a/src/com/serotonin/mango/rt/dataSource/jmx/JmxDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/jmx/JmxDataSourceRT.java index a5c8be4094..e1599968c9 100644 --- a/src/com/serotonin/mango/rt/dataSource/jmx/JmxDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/jmx/JmxDataSourceRT.java @@ -124,7 +124,7 @@ protected void doPoll(long time) { public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPointSource source) { if (server == null) { raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( - "dsEdit.jmx.writeFailed", dataPoint.getVO().getName())); + "dsEdit.jmx.writeFailed", dataPoint.getVO().getName()), dataPoint); return; } @@ -132,13 +132,13 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPo JmxPointLocatorRT loc = dataPoint.getPointLocator(); if (loc.getObjectName() == null) { raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( - "dsEdit.jmx.writeFailed", dataPoint.getVO().getName())); + "dsEdit.jmx.writeFailed", dataPoint.getVO().getName()), dataPoint); return; } if (loc.isComposite()) { raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( - "dsEdit.jmx.writeFailed.composite", dataPoint.getVO().getName())); + "dsEdit.jmx.writeFailed.composite", dataPoint.getVO().getName()), dataPoint); return; } @@ -146,10 +146,11 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPo loc.mangoValueToManagementValue(valueTime.getValue())); try { server.setAttribute(loc.getObjectName(), attr); + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Exception e) { raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( - "dsEdit.jmx.writeFailed.msg", dataPoint.getVO().getName(), e.getMessage())); + "dsEdit.jmx.writeFailed.msg", dataPoint.getVO().getName(), e.getMessage()), dataPoint); } } @@ -206,12 +207,12 @@ private boolean updateDataPoint(DataPointRT dp) { catch (MalformedObjectNameException e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("dsEdit.jmx.objectNameError", loc.getPointLocatorVO().getObjectName(), - dp.getVO().getName(), e.getMessage())); + dp.getVO().getName(), e.getMessage()), dp); return false; } catch (NullPointerException e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( - "dsEdit.jmx.objectNameNotFound", loc.getPointLocatorVO().getObjectName(), dp.getVO().getName())); + "dsEdit.jmx.objectNameNotFound", loc.getPointLocatorVO().getObjectName(), dp.getVO().getName()), dp); return false; } updated = true; @@ -224,7 +225,7 @@ private boolean updateDataPoint(DataPointRT dp) { } catch (Exception e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( - "common.default", e.getMessage())); + "common.default", e.getMessage()), dp); return false; } @@ -232,7 +233,7 @@ private boolean updateDataPoint(DataPointRT dp) { if (attr == null) { raiseEvent(POINT_READ_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "dsEdit.jmx.attributeNameNotFound", loc.getPointLocatorVO().getAttributeName(), dp.getVO() - .getName())); + .getName()), dp); return false; } @@ -242,7 +243,7 @@ private boolean updateDataPoint(DataPointRT dp) { if (!JmxPointLocatorRT.isValidType(type)) { raiseEvent(POINT_READ_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( - "dsEdit.jmx.attributeTypeNotSupported", type, dp.getVO().getName())); + "dsEdit.jmx.attributeTypeNotSupported", type, dp.getVO().getName()), dp); return false; } @@ -251,7 +252,7 @@ private boolean updateDataPoint(DataPointRT dp) { if (!attr.getType().equals("javax.management.openmbean.CompositeData")) { raiseEvent(POINT_READ_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "dsEdit.jmx.attributeNotComposite", loc.getPointLocatorVO().getAttributeName(), dp.getVO() - .getName())); + .getName()), dp); return false; } @@ -261,7 +262,7 @@ private boolean updateDataPoint(DataPointRT dp) { } catch (Exception e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( - "common.default", e.getMessage())); + "common.default", e.getMessage()), dp); return false; } @@ -269,7 +270,7 @@ private boolean updateDataPoint(DataPointRT dp) { if (openType == null) { raiseEvent(POINT_READ_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "dsEdit.jmx.compositeNameNotFound", loc.getPointLocatorVO().getCompositeItemName(), dp - .getVO().getName())); + .getVO().getName()), dp); return false; } @@ -277,7 +278,7 @@ private boolean updateDataPoint(DataPointRT dp) { if (!JmxPointLocatorRT.isValidType(type)) { raiseEvent(POINT_READ_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( - "dsEdit.jmx.compositeTypeNotSupported", type, dp.getVO().getName())); + "dsEdit.jmx.compositeTypeNotSupported", type, dp.getVO().getName()), dp); return false; } } diff --git a/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java index 3d23917390..b6d687fed2 100644 --- a/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java @@ -184,6 +184,7 @@ private boolean openConnection() { private void closeConnection() { try { master.close(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (IOException ex) { LOG.fatal("Close port", ex); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( diff --git a/src/com/serotonin/mango/rt/dataSource/meta/MetaDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/meta/MetaDataSourceRT.java index ed814affe1..bb609ca0af 100644 --- a/src/com/serotonin/mango/rt/dataSource/meta/MetaDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/meta/MetaDataSourceRT.java @@ -93,7 +93,7 @@ synchronized void checkForDisabledPoints() { if (contextPointDisabledEventActive) // A context point has been terminated, was never enabled, or not longer exists. raiseEvent(EVENT_TYPE_CONTEXT_POINT_DISABLED, System.currentTimeMillis(), true, new LocalizableMessage( - "event.meta.pointUnavailable", problemPoint.getVO().getName())); + "event.meta.pointUnavailable", problemPoint.getVO().getName()), problemPoint); else // Everything is good returnToNormal(EVENT_TYPE_CONTEXT_POINT_DISABLED, System.currentTimeMillis()); @@ -103,15 +103,22 @@ synchronized void checkForDisabledPoints() { public void raiseScriptError(long runtime, DataPointRT dataPoint, LocalizableMessage message) { if(isNone(EVENT_TYPE_SCRIPT_ERROR)) return; - raiseEvent(EVENT_TYPE_SCRIPT_ERROR, runtime, false, new LocalizableMessage("event.meta.scriptError", dataPoint - .getVO().getName(), message)); + raiseEvent(EVENT_TYPE_SCRIPT_ERROR, runtime, true, new LocalizableMessage("event.meta.scriptError", dataPoint + .getVO().getName(), message), dataPoint); } + public void returnToNormalScript(long runtime, DataPointRT dataPoint) { + if(isNone(EVENT_TYPE_SCRIPT_ERROR)) + return; + returnToNormal(EVENT_TYPE_SCRIPT_ERROR, runtime, dataPoint); + } + + public void raiseResultTypeError(long runtime, DataPointRT dataPoint, LocalizableMessage message) { if(isNone(EVENT_TYPE_RESULT_TYPE_ERROR)) return; - raiseEvent(EVENT_TYPE_RESULT_TYPE_ERROR, runtime, false, new LocalizableMessage("event.meta.typeError", - dataPoint.getVO().getName(), message)); + raiseEvent(EVENT_TYPE_RESULT_TYPE_ERROR, runtime, true, new LocalizableMessage("event.meta.typeError", + dataPoint.getVO().getName(), message), dataPoint); } private boolean isNone(int type) { @@ -120,4 +127,9 @@ private boolean isNone(int type) { return true; return object.getAlarmLevel() == AlarmLevels.NONE; } + + @Override + protected List getDataPoints() { + return points; + } } diff --git a/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java b/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java index 081f54b8cb..dff108715d 100644 --- a/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java +++ b/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java @@ -46,7 +46,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.setUnreliableDataPoint; import static com.serotonin.mango.util.LoggingScriptUtils.generateContext; import static com.serotonin.mango.util.LoggingScriptUtils.infoErrorExecutionScript; import static com.serotonin.mango.util.LoggingScriptUtils.infoErrorInitializationScript; @@ -244,7 +244,6 @@ void execute(long runtime, List sourceIds) { } if (count > MAX_RECURSION) { - setUnreliableDataPoint(dataPoint); handleError(runtime, new LocalizableMessage("event.meta.recursionFailure")); String msg = MessageFormat.format("Recursion failure: exceeded MAX_RECURSION: expected <= {0} but was {1}, Context: {2}", String.valueOf(MAX_RECURSION), count, generateContext(dataPoint, dataSource)); @@ -263,7 +262,6 @@ void execute(long runtime, List sourceIds) { handleError(runtime, new LocalizableMessage("event.meta.nullResult")); } else { updatePoint(pvt); - resetUnreliableDataPoint(dataPoint); } } catch (ScriptException e) { @@ -275,7 +273,6 @@ void execute(long runtime, List sourceIds) { LOG.warn(infoErrorExecutionScript(e, dataPoint, dataSource)); } catch (Exception e) { - setUnreliableDataPoint(dataPoint); LOG.warn(infoErrorExecutionScript(e, dataPoint, dataSource)); throw e; } @@ -290,9 +287,8 @@ private void createContext() { try { ScriptExecutor scriptExecutor = new ScriptExecutor(); context = scriptExecutor.convertContext(vo.getContext()); - resetUnreliableDataPoint(dataPoint); } catch (Exception e) { - setUnreliableDataPoint(dataPoint); + handleError(System.currentTimeMillis(), new LocalizableMessage("common.default", e.getMessage())); LOG.warn(infoErrorInitializationScript(e, dataPoint, dataSource)); } } @@ -321,10 +317,10 @@ private void execute(PointValueTime newValue) { protected void updatePoint(PointValueTime pvt) { dataPoint.updatePointValue(pvt); + dataSource.returnToNormalScript(pvt.getTime(), dataPoint); } protected void handleError(long runtime, LocalizableMessage message) { - setUnreliableDataPoint(dataPoint); dataSource.raiseScriptError(runtime, dataPoint, message); } } diff --git a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java index 69e3e9b3f8..4940915343 100644 --- a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java @@ -220,9 +220,7 @@ protected void doPoll(long time) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", dataPoint.getVO().getName(), - exceptionResult.getExceptionMessage())); - - setUnreliableDataPoint(dataPoint); + exceptionResult.getExceptionMessage()), dataPoint); // A response, albeit an undesirable one, was received // from @@ -241,11 +239,11 @@ protected void doPoll(long time) { new LocalizableMessage( "event.modbus.noConnection", dataPoint .getVO().getDataSourceName(), e - .getMessage())); + .getMessage()), dataPoint); } else { // Raise an event. raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, - getLocalExceptionMessage(e)); + getLocalExceptionMessage(e), dataPoint); } // Update the slave status. Only set to false if it is @@ -276,10 +274,9 @@ protected void doPoll(long time) { LOG.trace("Point: " + locator.getVO().getOffset() + " eventRaised: " + eventRaised); if (!eventRaised) { - returnToNormal(POINT_READ_EXCEPTION_EVENT, time); - resetUnreliableDataPoint(dataPoint); updatePointValue(dataPoint, locator, result, time); slaveStatuses.put(locator.getVO().getSlaveId(), true); + returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } } } @@ -344,9 +341,7 @@ protected void initialize(ModbusMaster modbusMaster) { // Deactivate any existing event. returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - resetUnreliableDataPoints(dataPoints); } catch (Exception e) { - setUnreliableDataPoints(dataPoints); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getLocalExceptionMessage(e)); return; @@ -389,15 +384,12 @@ public void forcePointRead(DataPointRT dataPoint) { synchronized (pointListChangeLock) { try { Object value = modbusMaster.getValue(ml); - - returnToNormal(POINT_READ_EXCEPTION_EVENT, time); - resetUnreliableDataPoint(dataPoint); updatePointValue(dataPoint, pl, value, time); + returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (ErrorResponseException e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", dataPoint - .getVO().getName(), e.getMessage())); - setUnreliableDataPoint(dataPoint); + .getVO().getName(), e.getMessage()), dataPoint); } catch (ModbusTransportException e) { // Don't raise a data source exception. Polling should do that. LOG.warn("Error during forcePointRead", e); @@ -460,29 +452,26 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, dataPoint.setPointValue(valueTime, source); // Deactivate any existing event. - returnToNormal(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime()); - resetUnreliableDataPoint(dataPoint); + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime(), dataPoint); } catch (ModbusTransportException e) { - setUnreliableDataPoint(dataPoint); if (e.getMessage().contains("no active connection")) { // Raise an event. raiseEvent(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime(), true, new LocalizableMessage( "event.modbus.noConnection", dataPoint.getVO() - .getDataSourceName(), e.getMessage())); + .getDataSourceName(), e.getMessage()), dataPoint); } else { // Raise an event. raiseEvent(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime(), true, new LocalizableMessage("event.exception2", - dataPoint.getVO().getName(), e.getMessage())); + dataPoint.getVO().getName(), e.getMessage()), dataPoint); LOG.info("Error setting point value", e); } } catch (ErrorResponseException e) { - setUnreliableDataPoint(dataPoint); raiseEvent(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime(), true, new LocalizableMessage("event.exception2", dataPoint .getVO().getName(), e.getErrorResponse() - .getExceptionMessage())); + .getExceptionMessage()), dataPoint); LOG.info("Error setting point value", e); } } diff --git a/src/com/serotonin/mango/rt/dataSource/onewire/OneWireDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/onewire/OneWireDataSourceRT.java index fcb8a2d38a..c42f4021ba 100644 --- a/src/com/serotonin/mango/rt/dataSource/onewire/OneWireDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/onewire/OneWireDataSourceRT.java @@ -375,9 +375,11 @@ else if (attributeId == OneWirePointLocatorVO.AttributeTypes.WIPER_POSITION) { // Event handling. if (exceptionMessage != null) - raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), false, exceptionMessage); - else + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), false, exceptionMessage, dataPoint); + else { dataPoint.setPointValue(valueTime, source); + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); + } } } diff --git a/src/com/serotonin/mango/rt/dataSource/openv4j/OpenV4JDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/openv4j/OpenV4JDataSourceRT.java index 5522392b74..eb2d7aa310 100644 --- a/src/com/serotonin/mango/rt/dataSource/openv4j/OpenV4JDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/openv4j/OpenV4JDataSourceRT.java @@ -168,11 +168,11 @@ public synchronized void setPointValue(DataPointRT dataPoint, PointValueTime val } catch (InterruptedException ex) { raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, - new LocalizableMessage("openv4j.interrupted")); + new LocalizableMessage("openv4j.interrupted"), dataPoint); } } - returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis()); - returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } finally { closePort(); diff --git a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java index a0c72bc7e8..87d46ca00c 100644 --- a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java @@ -99,7 +99,7 @@ public void addDataPoint(DataPointRT dataPoint) { @Override public void removeDataPoint(DataPointRT dataPoint) { - returnToNormal(PARSE_EXCEPTION_EVENT, System.currentTimeMillis()); + returnToNormal(PARSE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); super.removeDataPoint(dataPoint); } @@ -145,17 +145,13 @@ protected void pollFeed(int feedId, List points, long time) { lm = ((LocalizableException) e).getLocalizableMessage(); else lm = new LocalizableMessage("event.pachube.feed.retrievalError", feedId, e.getMessage()); - raiseEvent(DATA_RETRIEVAL_FAILURE_EVENT, time, true, lm); - - // Mark points as unreliable. - for (DataPointRT point : points) - setUnreliableDataPoint(point); + raiseEvent(DATA_RETRIEVAL_FAILURE_EVENT, time, true, lm, points); return; } // If we made it this far, everything is good. - returnToNormal(DATA_RETRIEVAL_FAILURE_EVENT, time); + returnToNormal(DATA_RETRIEVAL_FAILURE_EVENT, time, points); // We have the data. Now run the regex. LocalizableMessage parseErrorMessage = null; @@ -166,7 +162,6 @@ protected void pollFeed(int feedId, List points, long time) { if (dataValue == null) { parseErrorMessage = new LocalizableMessage("event.pachube.dataStreamNotFound", locator.getDataStreamId(), feedId); - setUnreliableDataPoint(dp); } else { try { @@ -204,9 +199,9 @@ protected void pollFeed(int feedId, List points, long time) { } if (parseErrorMessage != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseErrorMessage); + raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseErrorMessage, points); else - returnToNormal(PARSE_EXCEPTION_EVENT, time); + returnToNormal(PARSE_EXCEPTION_EVENT, time, points); } public static Map getData(HttpClient client, int feedId, String apiKey) @@ -276,12 +271,12 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPo dataPoint.setPointValue(valueTime, source); // Deactivate any existing event. - returnToNormal(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime()); + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime(), dataPoint); } catch (IOException e) { // Raise an event. raiseEvent(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime(), true, new LocalizableMessage( - "event.exception2", dataPoint.getVO().getName(), e.getMessage())); + "event.exception2", dataPoint.getVO().getName(), e.getMessage()), dataPoint); } } } diff --git a/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java index 4950a9cb87..92a79326b9 100644 --- a/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java @@ -60,7 +60,7 @@ public Pop3DataSourceRT(Pop3DataSourceVO vo) { @Override public void removeDataPoint(DataPointRT dataPoint) { - returnToNormal(PARSE_EXCEPTION_EVENT, System.currentTimeMillis()); + returnToNormal(PARSE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } @Override diff --git a/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java index 831dc9a27c..bae9c8dc7e 100644 --- a/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java @@ -31,7 +31,7 @@ import com.serotonin.web.i18n.LocalizableMessage; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.setUnreliableDataPoints; /** * @author Matthew Lohbihler @@ -144,11 +144,10 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, LocalizableMessage message = validatePdu(response); if (message != null) { - setUnreliableDataPoint(dataPoint); - raiseEvent(PDU_EXCEPTION_EVENT, valueTime.getTime(), false, message); + raiseEvent(PDU_EXCEPTION_EVENT, valueTime.getTime(), false, message, dataPoint); } else { dataPoint.setPointValue(valueTime, source); - resetUnreliableDataPoint(dataPoint); + returnToNormal(PDU_EXCEPTION_EVENT, valueTime.getTime(), dataPoint); } } public void setDeviceDidNotRespondDespiteTheCounterOfRetries(boolean deviceDidNotRespondDespiteTheCounterOfRetries) { @@ -217,7 +216,6 @@ private void doPollImpl(long time) throws IOException { setUnreliableDataPoints(dataPoints); // Common.ctx.getRuntimeManager().stopDataSourceAndDontJoinTermination(vo.getId()); } else if (message != null) { - setUnreliableDataPoints(dataPoints); raiseEvent(PDU_EXCEPTION_EVENT, time, true, message); } } @@ -231,11 +229,8 @@ private void doPollImpl(long time) throws IOException { updatePoint(dp, vb.getVariable(), time); } } - resetUnreliableDataPoints(dataPoints); } else { - setUnreliableDataPoints(dataPoints); raiseEvent(PDU_EXCEPTION_EVENT, time, true, validatePdu(response)); - } } @@ -283,10 +278,7 @@ private boolean logEventsDependsOnMessageType(MessageType messageType, VariableB } if(messageType!=MessageType.undefined) { - setUnreliableDataPoint(dp); raiseEvent(PDU_EXCEPTION_EVENT, time, true, message); - } else { - resetUnreliableDataPoint(dp); } return messageType!=MessageType.undefined; @@ -348,10 +340,8 @@ void receivedTrap(PDU trap) { // Take a look at the response. LocalizableMessage message = validatePdu(trap); if (message != null) { - setUnreliableDataPoints(dataPoints); raiseEvent(PDU_EXCEPTION_EVENT, time, false, message); } else { - resetUnreliableDataPoints(dataPoints); synchronized (pointListChangeLock) { updateChangedPoints(); @@ -368,11 +358,8 @@ void receivedTrap(PDU trap) { } if (!found) { - setUnreliableDataPoints(dataPoints); raiseEvent(TRAP_NOT_HANDLED_EVENT, time, false, new LocalizableMessage("event.snmp.trapNotHandled", vb)); log.warn("Trap not handled: " + vb); - } else { - resetUnreliableDataPoints(dataPoints); } } } @@ -383,6 +370,7 @@ private void updatePoint(DataPointRT dp, Variable variable, long time) { SnmpPointLocatorRT locator = dp.getPointLocator(); dp.updatePointValue(new PointValueTime(locator .variableToValue(variable), time)); + returnToNormal(PDU_EXCEPTION_EVENT, time, dp); } // @@ -402,9 +390,7 @@ public void initialize() { // Deactivate any existing event. returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - resetUnreliableDataPoints(dataPoints); } catch (Exception e) { - setUnreliableDataPoints(dataPoints); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, DataSourceRT.getExceptionMessage(e)); log.debug("Error while initializing data source", e); diff --git a/src/com/serotonin/mango/rt/dataSource/sql/SqlDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/sql/SqlDataSourceRT.java index 0d7613c115..8704a971f9 100644 --- a/src/com/serotonin/mango/rt/dataSource/sql/SqlDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/sql/SqlDataSourceRT.java @@ -101,13 +101,13 @@ else if (locatorVO.getDataTypeId() == DataTypes.IMAGE) { raiseEvent(STATEMENT_EXCEPTION_EVENT, valueTime.getTime(), false, new LocalizableMessage( "event.sql.noRowsUpdated", dataPoint.getVO() - .getName())); + .getName()), dataPoint); } else dataPoint.setPointValue(valueTime, source); } catch (Exception e) { raiseEvent(STATEMENT_EXCEPTION_EVENT, valueTime.getTime(), false, new LocalizableMessage("event.sql.setError", dataPoint - .getVO().getName(), getExceptionMessage(e))); + .getVO().getName(), getExceptionMessage(e)), dataPoint); } } @@ -191,7 +191,7 @@ private void updateByColumn(long time, ResultSet rs) throws SQLException { raiseEvent(STATEMENT_EXCEPTION_EVENT, time, true, new LocalizableMessage( "event.sql.timeNotFound", - timeOverride)); + timeOverride), dp); continue; } diff --git a/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java index 44a965b6e1..ce493cd04d 100644 --- a/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java @@ -26,7 +26,6 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -76,6 +75,8 @@ import com.serotonin.viconics.io.ViconicsOutgoingRequest; import com.serotonin.web.i18n.LocalizableMessage; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; + /** * @author Matthew Lohbihler */ @@ -148,7 +149,7 @@ public void addDataPoint(DataPointRT dataPoint) { super.addDataPoint(dataPoint); // Mark the point as unreliable. - DataPointUnreliableUtils.setUnreliableDataPoint(dataPoint); + setUnreliableDataPoint(dataPoint); // Add the point to the lookup map. pointLookup.put(new PointKey(dataPoint), dataPoint); @@ -177,12 +178,6 @@ public void terminate() { // / ViconicsNetworkListener // public void viconicsNetworkStatus(boolean online) { - // Mark all points as unreliable. - synchronized (dataPoints) { - for (DataPointRT rt : dataPoints) - DataPointUnreliableUtils.setUnreliableDataPoint(rt); - } - if (online) returnToNormal(NETWORK_OFFLINE_EVENT, System.currentTimeMillis()); else @@ -387,17 +382,6 @@ public void viconicsDeviceStatus(ViconicsDevice device, boolean online) { if (online) returnToNormal(DEVICE_OFFLINE_EVENT, System.currentTimeMillis()); else { - // Mark all points for the device as unreliable. - synchronized (dataPoints) { - for (DataPointRT rt : dataPoints) { - ViconicsPointLocatorVO locator = rt.getVO() - .getPointLocator(); - if (Arrays - .equals(locator.getDeviceIeee(), device.getIeee())) - DataPointUnreliableUtils.setUnreliableDataPoint(rt); - } - } - raiseEvent(DEVICE_OFFLINE_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("event.viconics.deviceOffline", device.getIeeeString())); @@ -473,9 +457,8 @@ public void viconicsDevicePointUpdated(ViconicsDevice device, throw new ShouldNeverHappenException("Unknown point type: " + point.getClass()); - DataPointUnreliableUtils.resetUnreliableDataPoint(rt); - rt.updatePointValue(new PointValueTime(mangoValue, time)); + resetUnreliableDataPoint(rt); } public void viconicsDuplicateCommAddressDetected(int commAddress) { @@ -510,13 +493,14 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime pvt, network.writeValue(locator.getDeviceIeee(), locator.getPointAddress(), value); dataPoint.setPointValue(pvt, source); + returnToNormal(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Exception e) { raiseEvent( MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), - false, + true, new LocalizableMessage("event.setPointFailed", e - .getMessage())); + .getMessage()), dataPoint); } } @@ -528,13 +512,14 @@ public void forcePointRead(DataPointRT dataPoint) { // Ignore the result. It will be sent via the listener anyway. network.readValue(locator.getDeviceIeee(), locator.getPointAddress()); + returnToNormal(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Exception e) { raiseEvent( MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage("event.readPointFailed", e - .getMessage())); + .getMessage()), dataPoint); } } diff --git a/src/com/serotonin/mango/util/LoggingUtils.java b/src/com/serotonin/mango/util/LoggingUtils.java index e8a09b138d..e73c9d637f 100644 --- a/src/com/serotonin/mango/util/LoggingUtils.java +++ b/src/com/serotonin/mango/util/LoggingUtils.java @@ -2,6 +2,7 @@ import br.org.scadabr.vo.scripting.ScriptVO; import com.serotonin.mango.Common; +import com.serotonin.mango.rt.dataImage.DataPointRT; import com.serotonin.mango.rt.dataImage.PointValueTime; import com.serotonin.mango.rt.dataImage.SetPointSource; import com.serotonin.mango.rt.dataSource.DataSourceRT; @@ -209,6 +210,30 @@ public static String entryInfo(PointValueService.BatchWriteBehindEntry entry) { return MessageFormat.format(info, entry.getPointId(), entry.getDataType(), entry.getTime(), entry.getDvalue()); } + public static String info(Exception e, DataSourceRT dataSourceRT) { + return exceptionInfo(e) + " - " + dataSourceInfo(dataSourceRT); + } + + public static String info(Exception e, DataSourceRT dataSourceRT, DataPointRT dataPointRT) { + return exceptionInfo(e) + " - " + dataSourceInfo(dataSourceRT) + " - " + dataPointInfo(dataPointRT); + } + + public static String dataPointInfo(DataPointRT dataPointRT) { + if(dataPointRT == null) + return ""; + DataPointVO dataPointVO = dataPointRT.getVO(); + if(dataPointVO == null) + return dataPointRtInfo(dataPointRT); + return dataPointInfo(dataPointVO); + } + + public static String dataPointRtInfo(DataPointRT dataPoint) { + if(dataPoint == null) + return ""; + String info = "datapointrt: {0} (id: {0}, xid: {1}, dataSourceId: {2})"; + return MessageFormat.format(info, String.valueOf(dataPoint.getId()), dataPoint.getDataSourceId()); + } + private static String msg(EventHandlerVO eventHandler) { return StringUtils.isEmpty(eventHandler.getAlias()) && eventHandler.getMessage() != null ? eventHandler.getMessage().getLocalizedMessage(Common.getBundle()) : eventHandler.getAlias(); } diff --git a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java index 7a2f9d46b0..92bfb62a2a 100644 --- a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java +++ b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java @@ -16,7 +16,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; import static com.serotonin.mango.util.LoggingUtils.*; @@ -52,21 +51,19 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPo if (!messagingService.isOpen(dataPoint)) { LOG.warn("Error Publish: " + dataSourcePointValueTimeInfo(vo, dataPointVO, valueTime, source)); raiseEvent(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis(), true, - getExceptionMessage(new RuntimeException("Error Publish: " + dataSourcePointValueTimeInfo(vo, dataPointVO, valueTime, source) + ", Message: Connection Closed. "))); - setUnreliableDataPoint(dataPoint); + getExceptionMessage(new RuntimeException("Error Publish: " + dataSourcePointValueTimeInfo(vo, dataPointVO, valueTime, source) + ", Message: Connection Closed. ")), + dataPoint); return; } String message = valueTime.getStringValue(); try { messagingService.publish(dataPoint, message); - returnToNormal(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis()); - resetUnreliableDataPoint(dataPoint); + returnToNormal(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Exception e) { LOG.error(dataSourcePointValueTimeInfo(vo, dataPointVO, valueTime, source) + ", " + exceptionInfo(e), e); raiseEvent(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis(), true, - new LocalizableMessage("event.ds.publishFailed", dataPointVO.getName())); - setUnreliableDataPoint(dataPoint); + new LocalizableMessage("event.ds.publishFailed", dataPointVO.getName()), dataPoint); } } @@ -74,10 +71,11 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPo public void initialize() { try { messagingService.open(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Exception e) { LOG.error(exceptionInfo(e), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), - false, getExceptionMessage(e)); + true, getExceptionMessage(e)); } super.initialize(); } @@ -88,10 +86,11 @@ public void terminate() { super.terminate(); try { messagingService.close(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Exception e) { LOG.error(exceptionInfo(e), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), - false, getExceptionMessage(e)); + true, getExceptionMessage(e)); } finally { updateAttemptsCounters.clear(); } @@ -101,13 +100,12 @@ public void terminate() { public void addDataPoint(DataPointRT dataPoint) { try { updateAttemptsCounters.putIfAbsent(dataPoint.getId(), new AtomicInteger()); - messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), ATTR_UPDATE_ERROR_KEY); - resetUnreliableDataPoint(dataPoint); + messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), getPointUpdateReturnToNormalHandler()); + returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Exception e) { LOG.error(exceptionInfo(e), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), - false, getExceptionMessage(e)); - setUnreliableDataPoint(dataPoint); + true, getExceptionMessage(e), dataPoint); } super.addDataPoint(dataPoint); } @@ -116,10 +114,11 @@ public void addDataPoint(DataPointRT dataPoint) { public void removeDataPoint(DataPointRT dataPoint) { try { messagingService.removeReceiver(dataPoint); + returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Exception e) { LOG.error(exceptionInfo(e), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), - false, getExceptionMessage(e)); + true, getExceptionMessage(e), dataPoint); } finally { updateAttemptsCounters.remove(dataPoint.getId()); } @@ -132,17 +131,15 @@ protected void doPoll(long time) { try { updateAttemptsCounters.putIfAbsent(dataPoint.getId(), new AtomicInteger()); if(updateAttemptsCounters.get(dataPoint.getId()).get() < updateAttempts) { - messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), ATTR_UPDATE_ERROR_KEY); + messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), getPointUpdateReturnToNormalHandler()); updateAttemptsCounters.get(dataPoint.getId()).set(0); - returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis()); - resetUnreliableDataPoint(dataPoint); + returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } } catch (Exception e) { updateAttemptsCounters.get(dataPoint.getId()).incrementAndGet(); LOG.warn(exceptionInfo(e), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), - true, getExceptionMessage(e)); - setUnreliableDataPoint(dataPoint); + true, getExceptionMessage(e), dataPoint); } } } @@ -152,9 +149,16 @@ private java.util.function.Consumer getPointUpdateExceptionHandler(Da LOG.warn("Error Update: " + dataPointInfo(dataPoint.getVO()) + ", " + dataSourceInfo(vo) + ", " + exceptionInfo(ex), ex); raiseEvent(DATA_POINT_UPDATE_EXCEPTION_EVENT, System.currentTimeMillis(), - false, getExceptionMessage(new Exception("Error Update Data Point: " + dataPointInfo(dataPoint.getVO()) + true, getExceptionMessage(new Exception("Error Update Data Point: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(ex), ex) - )); + ), dataPoint); + }; + } + + private java.util.function.Supplier getPointUpdateReturnToNormalHandler() { + return () -> { + returnToNormal(DATA_POINT_UPDATE_EXCEPTION_EVENT, System.currentTimeMillis()); + return null; }; } } \ No newline at end of file diff --git a/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java b/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java index a301f549ee..d9bef828c9 100644 --- a/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java +++ b/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java @@ -4,7 +4,8 @@ import org.scada_lts.ds.messaging.exception.MessagingChannelException; import java.util.function.Consumer; +import java.util.function.Supplier; public interface InitMessagingChannels extends MessagingChannels { - void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, String updateErrorKey) throws MessagingChannelException; + void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException; } diff --git a/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java b/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java index ada1108da5..46362d5d62 100644 --- a/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java +++ b/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java @@ -4,22 +4,20 @@ import java.nio.charset.StandardCharsets; import java.util.function.Consumer; - -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; +import java.util.function.Supplier; public class UpdatePointValueConsumer implements Consumer { private final DataPointRT dataPoint; private final Writable writable; - private final String updateErrorKey; private final Consumer exceptionHandler; + private final Supplier returnToNormal; - public UpdatePointValueConsumer(DataPointRT dataPoint, Writable writable, - String updateErrorKey, Consumer exceptionHandler) { + public UpdatePointValueConsumer(DataPointRT dataPoint, Writable writable, Consumer exceptionHandler, Supplier returnToNormal) { this.dataPoint = dataPoint; this.writable = writable; - this.updateErrorKey = updateErrorKey; this.exceptionHandler = exceptionHandler; + this.returnToNormal = returnToNormal; } @Override @@ -28,10 +26,9 @@ public void accept(byte[] payload) { try { String message = new String(payload, StandardCharsets.UTF_8); dataPoint.updatePointValue(message); - resetUnreliableDataPoint(updateErrorKey, dataPoint); + returnToNormal.get(); } catch (Exception ex) { exceptionHandler.accept(ex); - setUnreliableDataPoint(updateErrorKey, dataPoint); } } } diff --git a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java index 5589435ec0..213b65c025 100644 --- a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java +++ b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java @@ -8,17 +8,17 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; +import java.util.function.Supplier; final class AmqpChannelFactory { private AmqpChannelFactory() {} - static AmqpChannel createReceiver(DataPointRT dataPoint, AmqpConnection connection, Consumer exceptionHandler, - String updateErrorKey) throws IOException { + static AmqpChannel createReceiver(DataPointRT dataPoint, AmqpConnection connection, Consumer exceptionHandler, Supplier returnToNormal) throws IOException { AmqpChannel receive = configChannel(dataPoint, connection); if(receive == null) return null; - basicConsume(dataPoint, receive, exceptionHandler, updateErrorKey); + basicConsume(dataPoint, receive, exceptionHandler, returnToNormal); return receive; } @@ -59,13 +59,11 @@ private static void basicQos(AmqpChannel channel, AmqpPointLocatorVO vo) throws channel.basicQos(vo.getQos()); } - private static void basicConsume(DataPointRT dataPoint, AmqpChannel channel, Consumer exceptionHandler, - String updateErrorKey) throws IOException { + private static void basicConsume(DataPointRT dataPoint, AmqpChannel channel, Consumer exceptionHandler, Supplier returnToNormal) throws IOException { AmqpPointLocatorRT locator = dataPoint.getPointLocator(); AmqpPointLocatorVO vo = locator.getVO(); boolean noAck = vo.getMessageAck() == MessageAckType.NO_ACK; - channel.basicConsume(vo.getQueueName(), noAck, new UpdatePointValueConsumer(dataPoint, vo::isWritable, - updateErrorKey, exceptionHandler)); + channel.basicConsume(vo.getQueueName(), noAck, new UpdatePointValueConsumer(dataPoint, vo::isWritable, exceptionHandler, returnToNormal)); } private static void declare(AmqpChannel channel, AmqpPointLocatorVO vo) throws IOException { diff --git a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java index d07485cd71..ffded69691 100644 --- a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java +++ b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java @@ -76,7 +76,7 @@ public boolean isOpenChannel(DataPointRT dataPoint) { } @Override - public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, String updateErrorKey) throws MessagingChannelException { + public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { connectionManager.getIfOpen().or(() -> { try { return Optional.ofNullable(connectionManager.open(vo)); @@ -89,7 +89,7 @@ public void initChannel(DataPointRT dataPoint, Consumer exceptionHand try { channels.initChannel(dataPoint, () -> { try { - return new AmqpMessagingChannel(AmqpChannelFactory.createReceiver(dataPoint, conn, exceptionHandler, updateErrorKey), dataPoint); + return new AmqpMessagingChannel(AmqpChannelFactory.createReceiver(dataPoint, conn, exceptionHandler, returnToNormal), dataPoint); } catch (IOException e) { throw new MessagingChannelException("Error Create Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + causeInfo(e), e.getCause()); } catch (Exception e) { diff --git a/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java b/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java index 1dfa13dc8b..1060197892 100644 --- a/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java +++ b/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java @@ -46,11 +46,11 @@ public boolean isOpenChannel(DataPointRT dataPoint) { } @Override - public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, String updateErrorKey) throws MessagingChannelException { + public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { try { channels.initChannel(dataPoint, () -> { try { - return new MqttMessagingChannel(createClient(dataPoint, exceptionHandler, updateErrorKey), dataPoint); + return new MqttMessagingChannel(createClient(dataPoint, exceptionHandler, returnToNormal), dataPoint); } catch (Exception e) { throw new MessagingChannelException("Error Create Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + causeInfo(e), e.getCause()); } @@ -103,7 +103,7 @@ public int size() { return channels.size(); } - private MqttVClient createClient(DataPointRT dataPoint, Consumer exceptionHandler, String updateErrorKey) throws MessagingChannelException { + private MqttVClient createClient(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { MqttPointLocatorRT pointLocator = dataPoint.getPointLocator(); MqttPointLocatorVO locator = pointLocator.getVO(); @@ -121,7 +121,7 @@ private MqttVClient createClient(DataPointRT dataPoint, Consumer exce } try { client.subscribe(locator.getTopicFilter(), locator.getQos(), (topic, mqttMessage) -> - new UpdatePointValueConsumer(dataPoint, locator::isWritable, updateErrorKey, exceptionHandler).accept(mqttMessage.getPayload())); + new UpdatePointValueConsumer(dataPoint, locator::isWritable, exceptionHandler, returnToNormal).accept(mqttMessage.getPayload())); } catch (Exception e) { try { close(client); diff --git a/src/org/scada_lts/ds/messaging/service/MessagingService.java b/src/org/scada_lts/ds/messaging/service/MessagingService.java index 9d66fd17d3..6bf68a70df 100644 --- a/src/org/scada_lts/ds/messaging/service/MessagingService.java +++ b/src/org/scada_lts/ds/messaging/service/MessagingService.java @@ -4,6 +4,7 @@ import org.scada_lts.ds.messaging.exception.MessagingServiceException; import java.util.function.Consumer; +import java.util.function.Supplier; public interface MessagingService { @@ -12,7 +13,7 @@ public interface MessagingService { void open() throws MessagingServiceException; void close() throws MessagingServiceException; - void initReceiver(DataPointRT dataPoint, Consumer updateExceptionHandler, String updateErrorKey) throws MessagingServiceException; + void initReceiver(DataPointRT dataPoint, Consumer updateExceptionHandler, Supplier returnToNormal) throws MessagingServiceException; void removeReceiver(DataPointRT dataPoint) throws MessagingServiceException; void publish(DataPointRT dataPoint, String message) throws MessagingServiceException; } diff --git a/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java b/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java index cb9d44768f..de6d0ceaf5 100644 --- a/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java +++ b/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java @@ -8,6 +8,7 @@ import org.scada_lts.ds.messaging.exception.MessagingServiceException; import java.util.function.Consumer; +import java.util.function.Supplier; import static com.serotonin.mango.util.LoggingUtils.*; @@ -40,7 +41,7 @@ public void publish(DataPointRT dataPoint, String message) throws MessagingServi } @Override - public void initReceiver(DataPointRT dataPoint, Consumer exceptionHandler, String updateErrorKey) throws MessagingServiceException { + public void initReceiver(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingServiceException { if(blocked) { LOG.warn("Stop Init Receiver: " + dataSourceInfo(vo) + ", Service of shutting down: " + dataSourceInfo(vo)); return; @@ -49,7 +50,7 @@ public void initReceiver(DataPointRT dataPoint, Consumer exceptionHan return; } try { - channels.initChannel(dataPoint, exceptionHandler, updateErrorKey); + channels.initChannel(dataPoint, exceptionHandler, returnToNormal); } catch (Exception e) { throw new MessagingServiceException("Error Init Receiver: " + dataSourceInfo(vo) + ", " + exceptionInfo(e), e); } diff --git a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java new file mode 100644 index 0000000000..58540123e8 --- /dev/null +++ b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java @@ -0,0 +1,217 @@ +package com.serotonin.mango.rt.dataSource; + +import br.org.scadabr.db.utils.TestUtils; +import com.serotonin.db.IntValuePair; +import com.serotonin.mango.Common; +import com.serotonin.mango.rt.RuntimeManager; +import com.serotonin.mango.rt.dataImage.DataPointRT; +import com.serotonin.mango.rt.dataImage.PointValueCache; +import com.serotonin.mango.rt.dataImage.types.MangoValue; +import com.serotonin.mango.rt.dataSource.meta.MetaPointLocatorRT; +import com.serotonin.mango.vo.User; +import com.serotonin.mango.rt.dataSource.virtual.VirtualPointLocatorRT; +import com.serotonin.mango.vo.dataSource.meta.MetaPointLocatorVO; +import com.serotonin.mango.vo.dataSource.virtual.ChangeTypeVO; +import com.serotonin.mango.vo.dataSource.virtual.NoChangeVO; +import com.serotonin.mango.web.dwr.MiscDwr; +import com.serotonin.web.content.ContentGenerator; +import org.directwebremoting.WebContextFactory; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.scada_lts.dao.SystemSettingsDAO; +import utils.mock.MockUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; +import static org.mockito.ArgumentMatchers.*; +import static org.powermock.api.mockito.PowerMockito.*; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({WebContextFactory.class, Common.class, MiscDwr.class, SystemSettingsDAO.class, + ContentGenerator.class, PointValueCache.class, DataPointRT.class}) +@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", + "javax.activation.*", "javax.management.*"}) +public class DataPointUnreliableUtilsTest { + + private List metaDataPoints; + + + @Before + public void config() throws Exception { + RuntimeManager runtimeManager = mock(RuntimeManager.class); + metaDataPoints = new ArrayList<>(); + when(runtimeManager.getRunningMetaDataPoints(anyInt())).thenReturn(metaDataPoints); + MockUtils.configMock(runtimeManager, new User()); + PointValueCache pointValueCache = mock(PointValueCache.class); + whenNew(PointValueCache.class) + .withArguments(anyInt(), anyInt()) + .thenReturn(pointValueCache); + + MetaPointLocatorVO metaPointLocatorVO = new MetaPointLocatorVO(); + metaPointLocatorVO.setContext(Arrays.asList(new IntValuePair(11, ""))); + MetaPointLocatorRT metaPointLocatorRT = new MetaPointLocatorRT(metaPointLocatorVO); + + DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(111,-1), metaPointLocatorRT); + DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(112,-1), new MetaPointLocatorRT(new MetaPointLocatorVO())); + DataPointRT dataPointRT3 = new DataPointRT(TestUtils.newPointSettable(113,-1), new MetaPointLocatorRT(new MetaPointLocatorVO())); + metaDataPoints.addAll(Arrays.asList(dataPointRT1, dataPointRT2, dataPointRT3)); + } + + + @Test + public void when_setUnreliableDataPoint_with_point_then_unreliable() { + //given: + ChangeTypeVO changeTypeVO = new NoChangeVO(); + DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + + //when: + setUnreliableDataPoint(dataPointRT1); + + //then: + Assert.assertEquals(true, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + } + + @Test + public void when_setUnreliableDataPoints_with_points_then_unreliable() { + //given: + ChangeTypeVO changeTypeVO = new NoChangeVO(); + DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + + //when: + setUnreliableDataPoints(dataPoints); + + //then: + Assert.assertEquals(true, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + Assert.assertEquals(true, dataPointRT2.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + } + + @Test + public void when_resetUnreliableDataPoints_with_point_then_reliable() { + //given: + ChangeTypeVO changeTypeVO = new NoChangeVO(); + DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + + //when: + resetUnreliableDataPoint(dataPointRT1); + + //then: + Assert.assertEquals(false, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + } + + @Test + public void when_resetUnreliableDataPoints_with_points_then_reliable() { + //given: + ChangeTypeVO changeTypeVO = new NoChangeVO(); + DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + + //when: + resetUnreliableDataPoints(dataPoints); + + //then: + Assert.assertEquals(false, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + Assert.assertEquals(false, dataPointRT2.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + } + + /// + + @Test + public void when_setUnreliableDataPoint_with_point_then_meta_points_unreliable() { + //given: + ChangeTypeVO changeTypeVO = new NoChangeVO(); + DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + + //when: + setUnreliableDataPoint(dataPointRT1); + + //then: + for(DataPointRT dataPointRT: metaDataPoints) { + Assert.assertEquals(true, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + } + } + + @Test + public void when_setUnreliableDataPoints_with_points_then_meta_points_unreliable() { + //given: + ChangeTypeVO changeTypeVO = new NoChangeVO(); + DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + + //when: + setUnreliableDataPoints(dataPoints); + + //then: + for(DataPointRT dataPointRT: metaDataPoints) { + Assert.assertEquals(true, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + } + } + + @Test + public void when_resetUnreliableDataPoints_with_point_then_meta_points_reliable() { + //given: + ChangeTypeVO changeTypeVO = new NoChangeVO(); + DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + + //when: + resetUnreliableDataPoint(dataPointRT1); + + //then: + for(DataPointRT dataPointRT: metaDataPoints) { + Assert.assertEquals(false, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + } + } + + @Test + public void when_resetUnreliableDataPoints_with_points_then_meta_points_reliable() { + //given: + ChangeTypeVO changeTypeVO = new NoChangeVO(); + DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + + //when: + resetUnreliableDataPoints(dataPoints); + + //then: + for(DataPointRT dataPointRT: metaDataPoints) { + Assert.assertEquals(false, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + } + } + + /// + + @Test + public void when_not_invoke_setUnreliableDataPoints_or_setUnreliableDataPoint_then_false() { + //given: + ChangeTypeVO changeTypeVO = new NoChangeVO(); + DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), + new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + + //then: + Assert.assertEquals(false, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY) != null); + } +} \ No newline at end of file From 3d855835a750da791111ccc096b0b4d44a65290f Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 21 Feb 2024 11:48:20 +0100 Subject: [PATCH 06/63] #2755 signaling the data source that has a problem: - fixed Data Source use serial port - System Exception; --- build.gradle | 1 + .../dataSource/alpha2/Alpha2DataSource.java | 76 +++++++++---------- .../asciiFile/ASCIIFileDataSource.java | 5 +- .../asciiSerial/ASCIISerialDataSource.java | 60 +++++++++++---- .../rt/dataSource/dnp3/DNP3Master.java | 31 +++++--- .../rt/dataSource/dnp3/Dnp3DataSource.java | 13 ++-- .../rt/dataSource/dnp3/Dnp3IpDataSource.java | 6 +- .../dataSource/dnp3/Dnp3SerialDataSource.java | 6 +- .../DrStorageHt5bDataSource.java | 64 +++++++++++----- .../dataSource/iec101/IEC101DataSource.java | 30 +++++--- .../rt/dataSource/iec101/IEC101Master.java | 4 +- .../nodaves7/NodaveS7DataSource.java | 28 +++---- .../rt/dataSource/opc/OPCDataSource.java | 15 ++-- .../vo/dataSource/dnp3/Dnp3DataSourceVO.java | 2 + .../radiuino/RadiuinoEventDataSource.java | 51 ++++++++----- .../radiuino/RadiuinoPollingDataSource.java | 44 ++++++----- .../serotonin/mango/rt/RuntimeManager.java | 24 +++--- .../mango/rt/dataImage/DataPointRT.java | 2 +- .../dataSource/DataPointUnreliableUtils.java | 50 +++++++++--- .../mango/rt/dataSource/DataSourceRT.java | 9 ++- .../bacnet/BACnetIPDataSourceRT.java | 42 ++++++---- .../dataSource/galil/GalilDataSourceRT.java | 37 ++++----- .../dataSource/meta/MetaPointLocatorRT.java | 11 ++- .../dataSource/modbus/ModbusDataSource.java | 23 ++++-- .../onewire/OneWireDataSourceRT.java | 2 +- .../persistent/PersistentDataSourceRT.java | 4 +- .../rt/dataSource/snmp/SnmpDataSourceRT.java | 6 +- .../viconics/ViconicsDataSourceRT.java | 6 +- .../dataSource/vmstat/VMStatDataSourceRT.java | 3 +- .../serotonin/mango/util/LoggingUtils.java | 6 +- .../dataSource/modbus/ModbusDataSourceVO.java | 4 + .../ds/messaging/MessagingDataSourceRT.java | 1 + .../scada_lts/utils/MetaDataPointUtils.java | 36 +++++++++ test/messages_de.properties | 3 +- test/messages_en.properties | 3 +- test/messages_es.properties | 3 +- test/messages_fi.properties | 3 +- test/messages_fr.properties | 3 +- test/messages_lu.properties | 3 +- test/messages_nl.properties | 3 +- test/messages_pl.properties | 1 + test/messages_pt.properties | 3 +- test/messages_ru.properties | 3 +- test/messages_zh.properties | 3 +- webapp-resources/log4j2.xml | 25 ++++++ webapp-resources/messages_de.properties | 3 +- webapp-resources/messages_en.properties | 3 +- webapp-resources/messages_es.properties | 3 +- webapp-resources/messages_fi.properties | 3 +- webapp-resources/messages_fr.properties | 3 +- webapp-resources/messages_lu.properties | 3 +- webapp-resources/messages_nl.properties | 3 +- webapp-resources/messages_pl.properties | 1 + webapp-resources/messages_pt.properties | 3 +- webapp-resources/messages_ru.properties | 3 +- webapp-resources/messages_zh.properties | 3 +- 56 files changed, 521 insertions(+), 268 deletions(-) create mode 100644 src/org/scada_lts/utils/MetaDataPointUtils.java diff --git a/build.gradle b/build.gradle index 21eabbeeb6..b43c8d11a0 100644 --- a/build.gradle +++ b/build.gradle @@ -205,5 +205,6 @@ test { includeTestsMatching "com.serotonin.util.SerializationHelperTest" includeTestsMatching "org.scada_lts.web.mvc.api.json.WorkItemInfoListTest" includeTestsMatching "org.scada_lts.monitor.ConcurrentMonitoredValuesTest" + includeTestsMatching "com.serotonin.mango.rt.dataSource.DataPointUnreliableUtilsTest" } } \ No newline at end of file diff --git a/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java b/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java index d8d427c075..7b20b0553d 100644 --- a/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java @@ -22,10 +22,14 @@ import com.serotonin.mango.rt.dataImage.SetPointSource; import com.serotonin.mango.rt.dataImage.types.MangoValue; import com.serotonin.mango.rt.dataSource.PollingDataSource; +import com.serotonin.mango.util.LoggingUtils; import com.serotonin.web.i18n.LocalizableMessage; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; public class Alpha2DataSource extends PollingDataSource { + private static final Log LOG = LogFactory.getLog(Alpha2DataSource.class); public static final int POINT_READ_EXCEPTION_EVENT = 1; public static final int POINT_WRITE_EXCEPTION_EVENT = 2; public static final int DATA_SOURCE_EXCEPTION_EVENT = 3; @@ -65,6 +69,7 @@ protected void doPoll(long time) { MangoValue value = MangoValue.stringToValue(deviceValue .getValue(), rt.getDataTypeId()); rt.updatePointValue(new PointValueTime(value, time)); + returnToNormal(POINT_READ_EXCEPTION_EVENT, time, rt); } } @@ -131,18 +136,18 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, master.runController(); else master.stopController(); - } else + } else { master.write(devices); + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); + } } catch (Exception e) { - treatException(POINT_WRITE_EXCEPTION_EVENT, e, System - .currentTimeMillis()); + treatException(POINT_WRITE_EXCEPTION_EVENT, e, System.currentTimeMillis(), dataPoint); } } @Override public void initialize() { - super.initialize(); SerialParameters parameters = new SerialParameters(); parameters.setBaudRate(vo.getBaudRate()); @@ -155,10 +160,13 @@ public void initialize() { try { master.init(); master.lineCheck(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Exception e) { treatException(DATA_SOURCE_EXCEPTION_EVENT, e, System .currentTimeMillis()); + return; } + super.initialize(); } @@ -167,12 +175,17 @@ public void terminate() { super.terminate(); try { master.terminate(); - } catch (Exception e) { - e.printStackTrace(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + LOG.error(LoggingUtils.info(e, this), e); + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); } } private void treatException(int exceptionType, Exception e, long time) { + LOG.warn(LoggingUtils.info(e, this), e); if (e instanceof COMMException) { raiseEvent(exceptionType, time, true, new LocalizableMessage( "alpha2.commException", vo.getName(), e.getMessage())); @@ -190,37 +203,22 @@ private void treatException(int exceptionType, Exception e, long time) { } } - // public static void main(String[] args) { - // List lista = new ArrayList(); - // - // for (int i = 0; i < 250; i++) { - // lista.add("device " + i); - // } - // - // final int maxNum = 82; - // List> messages = new ArrayList>(); - // - // int numMessages = lista.size() % maxNum == 0 ? ((int) (lista.size() / - // maxNum)) - // : ((int) (lista.size() / maxNum)) + 1; - // - // for (int i = 0; i < numMessages; i++) { - // List temp; - // if (i == numMessages - 1) { - // temp = lista.subList(0 + (i * (maxNum)), lista.size()); - // } else { - // int init = 0 + (i * (maxNum)); - // int end = (maxNum) + ((maxNum) * i); - // temp = lista.subList(init, end); - // - // } - // messages.add(temp); - // } - // System.out.println("Enviar " + messages.size() + " mensagens!"); - // for (List list : messages) { - // System.out.println("Mensagem: " + list.size()); - // } - // - // } - + private void treatException(int exceptionType, Exception e, long time, DataPointRT dataPointRT) { + LOG.warn(LoggingUtils.info(e, this), e); + if (e instanceof COMMException) { + raiseEvent(exceptionType, time, true, new LocalizableMessage( + "alpha2.commException", vo.getName(), e.getMessage()), dataPointRT); + } else if (e instanceof InvalidFrameReceivedException) { + raiseEvent(exceptionType, time, true, new LocalizableMessage( + "alpha2.invalidFrameException", vo.getName(), e + .getMessage()), dataPointRT); + } else if (e instanceof ErrorMessageReceivedException) { + raiseEvent(exceptionType, time, true, new LocalizableMessage( + "alpha2.errorMessageException", vo.getName(), e + .getMessage()), dataPointRT); + } else { + raiseEvent(exceptionType, time, true, new LocalizableMessage( + "alpha2.unknownException", vo.getName(), e.getMessage()), dataPointRT); + } + } } diff --git a/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java b/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java index 38112ad3d0..10234745fa 100644 --- a/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java @@ -7,6 +7,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.serotonin.mango.util.LoggingUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -68,10 +69,10 @@ protected void doPoll(long time) { timestamp)); returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { + LOG.error(LoggingUtils.info(e, this), e); raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", vo .getName(), e.getMessage()), dataPoint); - e.printStackTrace(); } } @@ -144,7 +145,7 @@ private String readFile(File file) { } while (c != -1); reader.close(); } catch (Exception e) { - e.printStackTrace(); + LOG.error(LoggingUtils.info(e, this), e); } return sb.toString(); } diff --git a/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java b/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java index 15f13e0fe0..4efaea4018 100644 --- a/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java @@ -1,5 +1,6 @@ package br.org.scadabr.rt.dataSource.asciiSerial; +import com.serotonin.mango.util.LoggingUtils; import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; @@ -44,10 +45,6 @@ public ASCIISerialDataSource(ASCIISerialDataSourceVO vo) { setPollingPeriod(vo.getUpdatePeriodType(), vo.getUpdatePeriods(), vo.isQuantize()); - portList = CommPortIdentifier.getPortIdentifiers(); - getPort(vo.getCommPortId()); - configurePort(getsPort()); - } private boolean reconnect() { @@ -63,7 +60,8 @@ private boolean reconnect() { return true; } } - } catch (Exception e) { + } catch (Throwable e) { + LOG.warn(LoggingUtils.info(e, this), e); return false; } @@ -75,7 +73,7 @@ protected void doPoll(long time) { try { // nao tem dados - if (getInSerialStream().available() == 0) { + if (getInSerialStream() == null || getInSerialStream().available() == 0) { for (DataPointRT dataPoint : dataPoints) { ASCIISerialPointLocatorVO dataPointVO = dataPoint.getVO() @@ -187,6 +185,7 @@ protected void doPoll(long time) { value, timestamp)); returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { + LOG.warn(LoggingUtils.info(e, this), e); raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", vo.getName(), e.getMessage()), dataPoint); @@ -195,21 +194,38 @@ protected void doPoll(long time) { } - } catch (Exception e) { + } catch (Throwable e) { + LOG.warn(LoggingUtils.info(e, this), e); } } } catch (IOException io) { - getsPort().close(); - reconnect(); - } catch (Exception e) { + LOG.warn(LoggingUtils.info(io, this), io); + try { + getsPort().close(); + reconnect(); + } catch (Throwable e) { + LOG.warn(LoggingUtils.info(io, this), e); + } + } catch (Throwable e) { + LOG.warn(LoggingUtils.info(e, this), e); } } @Override public void initialize() { + try { + portList = CommPortIdentifier.getPortIdentifiers(); + getPort(vo.getCommPortId()); + configurePort(getsPort()); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + return; + } super.initialize(); - } private MangoValue getValue(ASCIISerialPointLocatorVO point, String arquivo) @@ -262,7 +278,17 @@ private long getTimestamp(ASCIISerialPointLocatorVO point, String arquivo) @Override public void terminate() { super.terminate(); - getsPort().close(); + try { + SerialPort serialPort = getsPort(); + if(serialPort != null) { + serialPort.close(); + } + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + } } @Override @@ -276,7 +302,8 @@ public void configurePort(SerialPort port) { try { setInSerialStream(port.getInputStream()); setOutSerialStream(port.getOutputStream()); - } catch (Exception e) { + } catch (Throwable e) { + LOG.warn(LoggingUtils.info(e, this), e); } port.notifyOnDataAvailable(true); @@ -284,7 +311,8 @@ public void configurePort(SerialPort port) { try { port.setSerialPortParams(vo.getBaudRate(), vo.getDataBits(), vo.getStopBits(), vo.getParity()); - } catch (Exception e) { + } catch (Throwable e) { + LOG.warn(LoggingUtils.info(e, this), e); } } @@ -300,8 +328,8 @@ public SerialPort getPort(String port) { serialPort = (SerialPort) portId.open(this.getName(), 10000); setsPort(serialPort); - } catch (Exception e) { - System.out.println("Erro ao abrir a porta !"); + } catch (Throwable e) { + LOG.error("Erro ao abrir a porta ! :" + LoggingUtils.info(e, this)); } } } diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/DNP3Master.java b/src/br/org/scadabr/rt/dataSource/dnp3/DNP3Master.java index 828acf6b10..39414d9715 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/DNP3Master.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/DNP3Master.java @@ -2,6 +2,7 @@ import java.util.List; +import com.serotonin.mango.util.LoggingUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -43,8 +44,10 @@ public void initSerial(int sourceAddress, int slaveAddress, String com, user.init(); } catch (Error e) { log.fatal(e.getMessage(), e); + throw e; } catch (Exception e) { log.error(e.getMessage(), e); + throw e; } } @@ -52,18 +55,24 @@ public void initSerial(int sourceAddress, int slaveAddress, String com, public void doPoll() throws Exception { if (reconnecting) { - log.debug("[DNP3Master] Trying to reconnect..."); + log.warn("[DNP3Master] Trying to reconnect..."); timeoutCount = 0; try { try { user.init(); reconnecting = false; - log.debug("[DNP3Master] Reconnected!"); - } catch (Exception | Error e) { - log.warn(e.getMessage(), e); - terminate(); + log.warn("[DNP3Master] Reconnected!"); + } catch (Throwable e) { + log.warn(LoggingUtils.exceptionInfo(e)); + try { + terminate(); + } catch (Throwable ex) { + log.warn(LoggingUtils.exceptionInfo(ex)); + throw ex; + } } } catch (Exception e) { + log.error(LoggingUtils.exceptionInfo(e)); throw e; } } else { @@ -72,10 +81,13 @@ public void doPoll() throws Exception { log.debug("[DNP3Master] Conexão falhou. Terminar Conexão."); terminate(); log.debug("[DNP3Master] Conexão terminada."); - throw new Exception("[DNP3Master] Poll failed!"); + throw new Exception("[DNP3Master] Poll failed! User: " + this.user + ", pollingCount: " + this.pollingCount + + ", relativePollingPeriod: " + this.relativePollingPeriod + + ", timeoutCount: " + this.timeoutCount + + ", reconnecting: " + this.reconnecting); } else { try { - log.debug("[DNP3Master] Poll " + pollingCount + " / " + log.warn("[DNP3Master] Poll " + pollingCount + " / " + relativePollingPeriod); if (pollingCount == 0) { user.sendSynch(user.buildReadStaticDataMsg()); @@ -87,10 +99,11 @@ public void doPoll() throws Exception { pollingCount = 0; } timeoutCount = 0; - } catch (Exception e) { - log.debug("[DNP3Master] Poll failed! (Error: " + } catch (Throwable e) { + log.warn("[DNP3Master] Poll failed! (Error: " + e.getMessage() + ")"); timeoutCount++; + throw e; } } diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java index 84eaf6dd8b..046da47c4c 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java @@ -5,6 +5,7 @@ import java.util.Date; import java.util.List; +import com.serotonin.mango.util.LoggingUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -45,8 +46,8 @@ protected void doPoll(long time) { try { dnp3Master.doPoll(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); - } catch (Exception e) { - LOG.warn(e.getMessage(), e); + } catch (Throwable e) { + LOG.warn(LoggingUtils.info(e, this), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); @@ -84,11 +85,11 @@ public void terminate() { try { dnp3Master.terminate(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { + } catch (Throwable e) { + LOG.error(LoggingUtils.info(e, this), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); - LOG.error(e.getMessage(), e); } } @@ -111,11 +112,11 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, .sendAnalogCommand(index, valueTime.getIntegerValue()); } returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { + } catch (Throwable e) { + LOG.error(LoggingUtils.info(e, this), e); raiseEvent(POINT_WRITE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage()), dataPoint); - LOG.error(e.getMessage(), e); } } diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java index 5144d7714f..f090d5fa5d 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3IpDataSource.java @@ -3,6 +3,7 @@ import br.org.scadabr.vo.dataSource.dnp3.Dnp3IpDataSourceVO; +import com.serotonin.mango.util.LoggingUtils; import com.serotonin.web.i18n.LocalizableMessage; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -27,11 +28,12 @@ public void initialize() { configuration.getPort(), configuration .getStaticPollPeriods()); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { - LOG.error(e.getMessage(), e); + } catch (Throwable e) { + LOG.error(LoggingUtils.info(e, this)); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("event.exception2", configuration .getName(), e.getMessage())); + return; } super.initialize(dnp3Master); diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java index 35de97de10..271ec35665 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java @@ -1,5 +1,6 @@ package br.org.scadabr.rt.dataSource.dnp3; +import com.serotonin.mango.util.LoggingUtils; import gnu.io.NoSuchPortException; import java.util.Date; @@ -31,11 +32,12 @@ public void initialize() { .getCommPortId(), configuration.getBaudRate(), configuration.getStaticPollPeriods()); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { - LOG.error(e.getMessage(), e); + } catch (Throwable e) { + LOG.error(LoggingUtils.info(e, this)); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", configuration .getName(), e.getMessage())); + return; } super.initialize(dnp3Master); diff --git a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java index af5afc18d9..2ca2bb357d 100644 --- a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java @@ -23,7 +23,7 @@ public class DrStorageHt5bDataSource extends PollingDataSource { - private final Log LOG = LogFactory.getLog(DrStorageHt5bDataSource.class); + private final static Log LOG = LogFactory.getLog(DrStorageHt5bDataSource.class); public static final int POINT_READ_EXCEPTION_EVENT = 1; public static final int DATA_SOURCE_EXCEPTION_EVENT = 2; private final DrStorageHt5bDataSourceVO vo; @@ -40,11 +40,6 @@ public DrStorageHt5bDataSource(DrStorageHt5bDataSourceVO vo) { this.vo = vo; setPollingPeriod(vo.getUpdatePeriodType(), vo.getUpdatePeriods(), vo .isQuantize()); - - portList = CommPortIdentifier.getPortIdentifiers(); - getPort(vo.getCommPortId()); - configurePort(getsPort()); - setValuesHt5b(new ArrayList()); } @Override @@ -52,7 +47,7 @@ protected void doPoll(long time) { try { - if (getInSerialStream().available() == 0) { + if (getInSerialStream() == null || getInSerialStream().available() == 0) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", @@ -92,10 +87,11 @@ protected void doPoll(long time) { } returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { + LOG.error(LoggingUtils.info(e, this)); raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", vo.getName(), e.getMessage()), dataPoint); - LOG.error(LoggingUtils.exceptionInfo(e) + " - " + LoggingUtils.dataSourceInfo(this), e); + } } @@ -103,12 +99,12 @@ protected void doPoll(long time) { getValuesHt5b().clear(); } catch (Exception e) { - e.printStackTrace(); + LOG.error(LoggingUtils.info(e, this)); } } } catch (Exception e) { - e.printStackTrace(); + LOG.error(LoggingUtils.info(e, this)); } } @@ -123,7 +119,14 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, @Override public void terminate() { super.terminate(); - getsPort().close(); + try { + getsPort().close(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + } } private String getTemperature(ArrayList ht5bValues) { @@ -233,19 +236,22 @@ private void toStringHexa(byte[] bytes) { } public static String getHexString(byte[] b) throws Exception { - String result = ""; - System.out.println("INICIO"); + LOG.info("INICIO"); + + StringBuilder result = new StringBuilder(""); for (int i = 0; i < b.length; i++) { - System.out.println(Integer.toString((b[i] & 0xff) + 0x100, 16) - .substring(1)); - result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); + String value = Integer.toString((b[i] & 0xff) + 0x100, 16) + .substring(1); + LOG.info(value); + + result.append(value); } - System.out.println("FIM"); + LOG.info("FIN"); - return result; + return result.toString(); } public static String getHex(byte[] raw) { @@ -293,9 +299,9 @@ public SerialPort getPort(String port) { serialPort = (SerialPort) portId.open(this.getName(), 10000); setsPort(serialPort); - } catch (Exception e) { - System.out.println("Error opening port " - + serialPort.getName() + "!"); + } catch (Throwable e) { + LOG.error("Error opening port " + serialPort.getName() + "! : " + + LoggingUtils.info(e, this)); } } } @@ -344,4 +350,20 @@ public void setsPort(SerialPort sPort) { this.sPort = sPort; } + @Override + public void initialize() { + try { + portList = CommPortIdentifier.getPortIdentifiers(); + getPort(vo.getCommPortId()); + configurePort(getsPort()); + setValuesHt5b(new ArrayList<>()); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + return; + } + super.initialize(); + } } diff --git a/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java b/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java index e9538c3553..d107941319 100644 --- a/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java @@ -40,11 +40,13 @@ public IEC101DataSource(IEC101DataSourceVO vo) { protected void doPoll(long time) { try { iec101Master.doPoll(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Exception e) { + LOG.error(LoggingUtils.info(e, this)); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); - LOG.error(LoggingUtils.info(e, this), e); + return; } for (DataPointRT dataPoint : dataPoints) { @@ -59,8 +61,15 @@ protected void doPoll(long time) { .getValue(), pointLocator.getDataTypeId()); Calendar ts = Calendar.getInstance(); ts.setTimeInMillis(dataElement.getTimestamp()); - dataPoint.updatePointValue(new PointValueTime(value, ts - .getTimeInMillis())); + try { + dataPoint.updatePointValue(new PointValueTime(value, ts + .getTimeInMillis())); + returnToNormal(POINT_READ_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); + } catch (Exception e) { + raiseEvent(POINT_READ_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", vo.getName(), e + .getMessage()), dataPoint); + } } } } @@ -87,11 +96,11 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, .getIntegerValue()); } returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { + } catch (Throwable e) { + LOG.error(LoggingUtils.info(e, this, dataPoint), e); raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage()), dataPoint); - LOG.error(LoggingUtils.info(e, this, dataPoint), e); } } @@ -114,11 +123,13 @@ protected void initialize(IEC101Master iec101Master) { this.iec101Master = iec101Master; try { iec101Master.init(vo.getGiRelativePeriod()); - } catch (Exception e) { + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + LOG.error(LoggingUtils.info(e, this), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); - LOG.error(LoggingUtils.info(e, this), e); + return; } super.initialize(); } @@ -128,11 +139,12 @@ public void terminate() { super.terminate(); try { iec101Master.terminate(); - } catch (Exception e) { + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + LOG.error(LoggingUtils.info(e, this), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); - LOG.error(LoggingUtils.info(e, this), e); } } diff --git a/src/br/org/scadabr/rt/dataSource/iec101/IEC101Master.java b/src/br/org/scadabr/rt/dataSource/iec101/IEC101Master.java index d9c83c4568..8563d476f9 100644 --- a/src/br/org/scadabr/rt/dataSource/iec101/IEC101Master.java +++ b/src/br/org/scadabr/rt/dataSource/iec101/IEC101Master.java @@ -47,9 +47,11 @@ public void doPoll() throws Exception { reconnecting = false; } else { terminate(); + throw new Exception("Trying to reconnect failed."); } } catch (Exception e) { - e.printStackTrace(); + Thread.sleep(100); + throw e; } } else { diff --git a/src/br/org/scadabr/rt/dataSource/nodaves7/NodaveS7DataSource.java b/src/br/org/scadabr/rt/dataSource/nodaves7/NodaveS7DataSource.java index 54cd7cb2fc..373dd7f27d 100644 --- a/src/br/org/scadabr/rt/dataSource/nodaves7/NodaveS7DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/nodaves7/NodaveS7DataSource.java @@ -77,13 +77,13 @@ protected void doPoll(long time) { timestamp)); returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { + LOG.error(LoggingUtils.info(e, this, dataPoint)); raiseEvent( POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", vo .getName(), e.getMessage()), dataPoint); - LOG.error(LoggingUtils.info(e, this, dataPoint), e); } } @@ -140,37 +140,31 @@ private long getTimestamp(NodaveS7PointLocatorVO point, String arquivo) public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPointSource source) { - System.out.println("WRITE datapoint to S7 :"); + LOG.info("WRITE datapoint to S7 :"); - System.out.println("Command: " + this.vo.getNodaveWriteBaseCmd()); + LOG.info("Command: " + this.vo.getNodaveWriteBaseCmd()); - System.out - .println("AREA " + LOG.info("AREA " + ((NodaveS7PointLocatorVO) dataPoint.getVO() .getPointLocator()).getS7writeMemoryArea()); - System.out - .println("DBNUM " + LOG.info("DBNUM " + ((NodaveS7PointLocatorVO) dataPoint.getVO() .getPointLocator()).getS7writeDBNUM()); - System.out - .println("BYTES " + LOG.info("BYTES " + ((NodaveS7PointLocatorVO) dataPoint.getVO() .getPointLocator()).getS7writeBytesQty()); - System.out - .println("STARTS " + LOG.info("STARTS " + ((NodaveS7PointLocatorVO) dataPoint.getVO() .getPointLocator()).getS7writeStarts()); - System.out - .println("BIT " + LOG.info("BIT " + ((NodaveS7PointLocatorVO) dataPoint.getVO() .getPointLocator()).getS7writeBitOffset()); - System.out - .println("TYPE " + LOG.info("TYPE " + ((NodaveS7PointLocatorVO) dataPoint.getVO() .getPointLocator()).getDataType()); - System.out.println(valueTime.toString()); + LOG.info(valueTime.toString()); // datatype 1 => binario // datatype 2 => multistate @@ -212,7 +206,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, break; } } - System.out.println("Writing binary - converted to " + converted); + LOG.info("Writing binary - converted to " + converted); } diff --git a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java index 47fb56cd70..504d750532 100644 --- a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java @@ -63,7 +63,8 @@ protected void doPoll(long time) { returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); } - } catch (Exception e) { + } catch (Throwable e) { + LOG.error("[OPC] Poll Failed ! :" + LoggingUtils.info(e, this)); raiseEvent( DATA_SOURCE_EXCEPTION_EVENT, time, @@ -71,7 +72,7 @@ protected void doPoll(long time) { new LocalizableMessage("event.exception2", vo.getName(), e .getMessage())); timeoutCount++; - LOG.error("[OPC] Poll Failed ! :" + LoggingUtils.info(e, this)); + return; } for (DataPointRT dataPoint : dataPoints) { @@ -87,7 +88,7 @@ protected void doPoll(long time) { dataPoint .updatePointValue(new PointValueTime(mangoValue, time)); returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", vo.getName(), e.getMessage()), dataPoint); @@ -112,14 +113,14 @@ else if (dataPoint.getDataTypeId() == DataTypes.MULTISTATE) try { opcMaster.write(tag, value); - } catch (Exception e) { + } catch (Throwable e) { + LOG.error(LoggingUtils.info(e, this, dataPoint), e); raiseEvent( POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("event.exception2", vo.getName(), e .getMessage()), dataPoint); - LOG.error(LoggingUtils.info(e, this, dataPoint), e); } } @@ -136,7 +137,7 @@ public void initialize() { opcMaster.init(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { + } catch (Throwable e) { String message = e.getMessage(); if(e.getMessage() != null && e.getMessage().contains("Unknown Error")) { message = "The OPC DA Server for the data source settings may not be found. "; @@ -158,7 +159,7 @@ public void terminate() { super.terminate(); try { opcMaster.terminate(); - } catch (Exception e) { + } catch (Throwable e) { String message = e.getMessage(); if(e instanceof NullPointerException) { message = "The client may not have been properly initialized. "; diff --git a/src/br/org/scadabr/vo/dataSource/dnp3/Dnp3DataSourceVO.java b/src/br/org/scadabr/vo/dataSource/dnp3/Dnp3DataSourceVO.java index 3f8f3a8ef4..f2ba25cde4 100644 --- a/src/br/org/scadabr/vo/dataSource/dnp3/Dnp3DataSourceVO.java +++ b/src/br/org/scadabr/vo/dataSource/dnp3/Dnp3DataSourceVO.java @@ -44,6 +44,8 @@ protected void addEventTypes(List eventTypes) { "DATA_SOURCE_EXCEPTION"); EVENT_CODES.addElement(Dnp3DataSource.POINT_READ_EXCEPTION_EVENT, "POINT_READ_EXCEPTION"); + EVENT_CODES.addElement(Dnp3DataSource.POINT_WRITE_EXCEPTION_EVENT, + "POINT_WRITE_EXCEPTION"); } @Override diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java index 54b5bc0840..c08f2fd3e3 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java @@ -1,5 +1,6 @@ package cc.radiuino.scadabr.rt.datasource.radiuino; +import com.serotonin.mango.util.LoggingUtils; import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; @@ -66,8 +67,8 @@ private boolean reconnect() { return true; } } - } catch (Exception e) { - LOG.error("Erro ao conectar na porta serial", e); + } catch (Throwable e) { + LOG.error("Erro ao conectar na porta serial: " + LoggingUtils.info(e, this)); return false; } @@ -75,13 +76,22 @@ private boolean reconnect() { @Override public void initialize() { - super.initialize(); LOG.debug("Inicializando o Radiuino Polling Data Source."); - portList = CommPortIdentifier.getPortIdentifiers(); - getPort(vo.getCommPortId(), vo.getTimeout()); - configurePort(getsPort()); + try { + portList = CommPortIdentifier.getPortIdentifiers(); + getPort(vo.getCommPortId(), vo.getTimeout()); + configurePort(getsPort()); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + return; + } + + super.initialize(); } @Override @@ -155,11 +165,15 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, enviarPacote(pacoteEnvio, 1); } catch (IOException io) { - LOG.error("Erro ao setar valor no data point Radiuino.", io); - getsPort().close(); - reconnect(); + LOG.error("Erro ao setar valor no data point Radiuino: " + LoggingUtils.info(io, this)); + try { + getsPort().close(); + reconnect(); + } catch (Throwable e) { + LOG.error(LoggingUtils.info(e, this)); + } } catch (Exception e) { - LOG.error("Erro geral ao setar valor no datasource.", e); + LOG.error("Erro geral ao setar valor no datasource: " + LoggingUtils.info(e, this)); } } @@ -197,8 +211,7 @@ private void enviarPacote(final byte[] pacoteEnvio, final int retries) try { Thread.sleep(100); } catch (InterruptedException e) { - LOG.error("Erro ao aguardar por pacote.", e); - e.printStackTrace(); + LOG.error("Erro ao aguardar por pacote: " + LoggingUtils.info(e, this), e); } } while ((new Date().getTime() - startTime) < timeout); LOG.debug("Ainda esperando pacote " + new Date().getTime()); @@ -220,7 +233,7 @@ private void configurePort(SerialPort port) { setInSerialStream(port.getInputStream()); setOutSerialStream(port.getOutputStream()); } catch (Exception e) { - LOG.error("Erro ao configurar streaming de in e out", e); + LOG.error("Erro ao configurar streaming de in e out: " + LoggingUtils.info(e, this)); } port.notifyOnDataAvailable(true); @@ -228,16 +241,16 @@ private void configurePort(SerialPort port) { port.addEventListener(this); port.enableReceiveTimeout(vo.getTimeout()); } catch (UnsupportedCommOperationException e1) { - LOG.error("Comando nao suportado ao abrir a porta serial.", e1); + LOG.error("Comando nao suportado ao abrir a porta serial: " + LoggingUtils.info(e1, this)); } catch (TooManyListenersException e) { - LOG.error("Muitos Listeners adicionados a porta serial", e); + LOG.error("Muitos Listeners adicionados a porta serial: " + LoggingUtils.info(e, this)); } try { port.setSerialPortParams(vo.getBaudRate(), vo.getDataBits(), vo.getStopBits(), vo.getParity()); } catch (Exception e) { - LOG.error("Erro ao setar parametros da porta serial", e); + LOG.error("Erro ao setar parametros da porta serial: " + LoggingUtils.info(e, this)); } } @@ -255,7 +268,7 @@ private SerialPort getPort(String port, int timeout) { timeout); setsPort(serialPort); } catch (Exception e) { - LOG.error("Erro ao abrir a porta serial.", e); + LOG.error("Erro ao abrir a porta serial: " + LoggingUtils.info(e, this)); } } } @@ -305,7 +318,7 @@ public void serialEvent(SerialPortEvent serialPortEvent) { pacoteRecebido(); } } catch (IOException e) { - LOG.error("Erro ao receber dados da porta serial", e); + LOG.error("Erro ao receber dados da porta serial: " + LoggingUtils.info(e, this)); } default: @@ -328,7 +341,7 @@ private void pacoteRecebido() { dataPoint.updatePointValue(pointValueTime); returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); } catch (Exception e) { - LOG.error("Erro ao fazer o parse dos dados.", e); + LOG.error("Erro ao fazer o parse dos dados: " + LoggingUtils.info(e, this, dataPoint)); raiseEvent( POINT_READ_EXCEPTION_EVENT, time, diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java index 9095643edc..15ded1b269 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java @@ -1,5 +1,6 @@ package cc.radiuino.scadabr.rt.datasource.radiuino; +import com.serotonin.mango.util.LoggingUtils; import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; @@ -69,7 +70,7 @@ private boolean reconnect() { return true; } } - } catch (Exception e) { + } catch (Throwable e) { LOG.error("Erro ao conectar na porta serial", e); return false; } @@ -153,13 +154,22 @@ protected void doPoll(long time) { @Override public void initialize() { - super.initialize(); LOG.debug("Inicializando o Radiuino Polling Data Source."); - portList = CommPortIdentifier.getPortIdentifiers(); - getPort(vo.getCommPortId(), vo.getTimeout()); - configurePort(getsPort()); + try { + portList = CommPortIdentifier.getPortIdentifiers(); + getPort(vo.getCommPortId(), vo.getTimeout()); + configurePort(getsPort()); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + return; + } + + super.initialize(); } @Override @@ -297,8 +307,8 @@ private void configurePort(SerialPort port) { try { setInSerialStream(port.getInputStream()); setOutSerialStream(port.getOutputStream()); - } catch (Exception e) { - LOG.error("Erro ao configurar streaming de in e out", e); + } catch (Throwable e) { + LOG.error("Erro ao configurar streaming de in e out: " + LoggingUtils.info(e, this)); } port.notifyOnDataAvailable(true); @@ -306,16 +316,16 @@ private void configurePort(SerialPort port) { port.addEventListener(this); port.enableReceiveTimeout(vo.getTimeout()); } catch (UnsupportedCommOperationException e1) { - LOG.error("Comando nao suportado ao abrir a porta serial.", e1); + LOG.error("Comando nao suportado ao abrir a porta serial: " + LoggingUtils.info(e1, this)); } catch (TooManyListenersException e) { - LOG.error("Muitos Listeners adicionados a porta serial", e); + LOG.error("Muitos Listeners adicionados a porta serial: " + LoggingUtils.info(e, this)); } try { port.setSerialPortParams(vo.getBaudRate(), vo.getDataBits(), vo.getStopBits(), vo.getParity()); - } catch (Exception e) { - LOG.error("Erro ao setar parametros da porta serial", e); + } catch (Throwable e) { + LOG.error("Erro ao setar parametros da porta serial: " + LoggingUtils.info(e, this)); } } @@ -332,8 +342,8 @@ private SerialPort getPort(String port, int timeout) { serialPort = (SerialPort) portId.open(this.getName(), timeout); setsPort(serialPort); - } catch (Exception e) { - LOG.error("Erro ao abrir a porta serial.", e); + } catch (Throwable e) { + LOG.error("Erro ao abrir a porta serial: " + LoggingUtils.info(e, this)); } } } @@ -387,14 +397,14 @@ public void serialEvent(SerialPortEvent serialPortEvent) { pacoteRecebido(); } } catch (IOException e) { - LOG.error("Erro ao receber dados da porta serial", e); + LOG.error("Erro ao receber dados da porta serial: " + LoggingUtils.info(e, this)); } } else { try { int i = getInSerialStream().read(buffer); } catch (IOException e) { - LOG.error("Erro ao ler dados da porta serial", e); + LOG.error("Erro ao ler dados da porta serial: " + LoggingUtils.info(e, this)); } } default: @@ -416,8 +426,8 @@ private void pacoteRecebido() { if (pointValueTime != null) dataPoint.updatePointValue(pointValueTime); returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); - } catch (Exception e) { - LOG.error("Erro ao fazer o parse dos dados.", e); + } catch (Throwable e) { + LOG.error("Erro ao fazer o parse dos dados: " + LoggingUtils.info(e, this)); raiseEvent( POINT_READ_EXCEPTION_EVENT, time, diff --git a/src/com/serotonin/mango/rt/RuntimeManager.java b/src/com/serotonin/mango/rt/RuntimeManager.java index a1b28a38dd..b58f1e36b3 100644 --- a/src/com/serotonin/mango/rt/RuntimeManager.java +++ b/src/com/serotonin/mango/rt/RuntimeManager.java @@ -27,7 +27,6 @@ import com.serotonin.db.IntValuePair; import com.serotonin.mango.db.dao.*; import com.serotonin.mango.rt.dataImage.*; -import com.serotonin.mango.rt.dataSource.meta.MetaPointLocatorRT; import com.serotonin.mango.rt.event.*; import com.serotonin.mango.rt.event.schedule.ResetDailyLimitSendingEventRT; import com.serotonin.mango.rt.event.schedule.ScheduledExecuteInactiveEventRT; @@ -75,6 +74,10 @@ import com.serotonin.web.i18n.LocalizableException; import com.serotonin.web.i18n.LocalizableMessage; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; +import static org.scada_lts.utils.MetaDataPointUtils.isDataPointInContext; +import static org.scada_lts.utils.MetaDataPointUtils.isMetaDataPointRT; + public class RuntimeManager { private static final Log LOG = LogFactory.getLog(RuntimeManager.class); @@ -488,7 +491,13 @@ private void startDataPoint(DataPointVO vo) { // Add/update it in the data source. ds.addDataPoint(dataPoint); - LOG.info("Data point '" + vo.getExtendedName() + "' initialized"); + boolean reliable = isReliable(dataPoint); + if(reliable) + resetUnreliableDataPoint(dataPoint); + else if(!ds.isInitialized()) + setUnreliableDataPoint(dataPoint); + + LOG.info("Data point '" + vo.getExtendedName() + "' initialized - reliable: " + reliable); } } } @@ -1142,15 +1151,8 @@ private void collectMetaDataPointsFromContext(Set toCheck, List getRunningMetaDataPoints(int dataPointInContextId) { Map dataPoints = new HashMap<>(this.dataPoints); - return filterRunningDataPoints(new ArrayList<>(dataPoints.values()), dataPoint -> - Objects.nonNull(dataPoint.getPointLocator()) - && dataPoint.getPointLocator() instanceof MetaPointLocatorRT - && Objects.nonNull((((MetaPointLocatorRT) dataPoint.getPointLocator()).getPointLocatorVO())) - && Objects.nonNull((((MetaPointLocatorRT) dataPoint.getPointLocator()).getPointLocatorVO()).getContext()) - && (((MetaPointLocatorRT) dataPoint.getPointLocator()).getPointLocatorVO()).getContext().stream() - .map(IntValuePair::getKey) - .collect(Collectors.toList()) - .contains(dataPointInContextId)); + return filterRunningDataPoints(new ArrayList<>(dataPoints.values()), dataPoint -> isMetaDataPointRT(dataPoint) + && isDataPointInContext(dataPoint, dataPointInContextId)); } private static List filterRunningDataPoints(List dataPoints, Predicate filter) { diff --git a/src/com/serotonin/mango/rt/dataImage/DataPointRT.java b/src/com/serotonin/mango/rt/dataImage/DataPointRT.java index 87ddbdd0d6..61971a2f4b 100644 --- a/src/com/serotonin/mango/rt/dataImage/DataPointRT.java +++ b/src/com/serotonin/mango/rt/dataImage/DataPointRT.java @@ -52,7 +52,7 @@ import static org.scada_lts.utils.PointValueStateUtils.isSetPointHandler; -public class DataPointRT implements IDataPoint, ILifecycle, TimeoutClient, ScadaWebSockets, IDataPointRT { +public class DataPointRT implements IDataPoint, ILifecycle, TimeoutClient, ScadaWebSockets { private static final Log LOG = LogFactory.getLog(DataPointRT.class); private static final PvtTimeComparator pvtTimeComparator = new PvtTimeComparator(); diff --git a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java index b09bd2acda..0817818ada 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java +++ b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java @@ -2,50 +2,76 @@ import com.serotonin.mango.Common; import com.serotonin.mango.rt.dataImage.DataPointRT; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import java.util.Collections; import java.util.List; import java.util.function.*; +import java.util.stream.Collectors; public final class DataPointUnreliableUtils { + private static final Log LOG = LogFactory.getLog(DataPointUnreliableUtils.class); + public static final String ATTR_UNRELIABLE_KEY = "UNRELIABLE"; private DataPointUnreliableUtils() {} public static void setUnreliableDataPoints(List dataPoints) { - unreliable(dataPoints, DataPointUnreliableUtils::setAttributes, Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, true); + unreliable(dataPoints, DataPointUnreliableUtils::setAttributes, + Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, true, 9); } public static void setUnreliableDataPoint(DataPointRT dataPoint) { - unreliable(Collections.singletonList(dataPoint), DataPointUnreliableUtils::setAttributes, Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, true); + unreliable(Collections.singletonList(dataPoint), DataPointUnreliableUtils::setAttributes, + Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, true, 9); } public static void resetUnreliableDataPoints(List dataPoints) { - unreliable(dataPoints, DataPointUnreliableUtils::setAttributes, Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, false); + unreliable(dataPoints, DataPointUnreliableUtils::setAttributes, + Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, false, 9); } public static void resetUnreliableDataPoint(DataPointRT dataPoint) { - unreliable(Collections.singletonList(dataPoint), DataPointUnreliableUtils::setAttributes, Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, false); + unreliable(Collections.singletonList(dataPoint), DataPointUnreliableUtils::setAttributes, + Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, false, 9); } private static void unreliable(List dataPoints, BiConsumer, Boolean> setList, - IntFunction> getData, boolean unreliable) { - setList.accept(dataPoints, unreliable); + IntFunction> getData, boolean unreliable, int safe) { + setList.accept(filter(dataPoints, unreliable), unreliable); for(DataPointRT dataPoint: dataPoints) { List metaDataPoints = getData.apply(dataPoint.getId()); - setList.accept(metaDataPoints, unreliable); + if(!metaDataPoints.isEmpty()) { + if(safe > -1) + unreliable(metaDataPoints, setList, getData, unreliable, --safe); + else { + LOG.warn("The safe counter has been exceeded!"); + setList.accept(filter(metaDataPoints, unreliable), unreliable); + } + } } } private static void setAttributes(List dataPoints, boolean unreliable) { - for (DataPointRT dp : dataPoints) { - setAttribute(dp, unreliable); + for (DataPointRT dataPoint : dataPoints) { + dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, unreliable); } } - private static void setAttribute(DataPointRT dataPoint, boolean unreliable) { - dataPoint.setAttribute(ATTR_UNRELIABLE_KEY, unreliable); + private static List filter(List dataPoints, boolean unreliable) { + return dataPoints.stream().filter(dataPoint -> !isSetUnreliable(dataPoint, unreliable)) + .collect(Collectors.toList()); + } + + private static boolean isSetUnreliable(DataPointRT dataPoint, boolean unreliable) { + return dataPoint.getAttribute(ATTR_UNRELIABLE_KEY) != null + && ((boolean) dataPoint.getAttribute(ATTR_UNRELIABLE_KEY)) == unreliable; + } + + public static boolean isReliable(DataPointRT dataPoint) { + return !isSetUnreliable(dataPoint, true) || isSetUnreliable(dataPoint, false); } -} +} \ No newline at end of file diff --git a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java index 4c19a25a0c..b4589ec4ba 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java @@ -51,9 +51,11 @@ * @author Matthew Lohbihler */ abstract public class DataSourceRT implements ILifecycle { - @Deprecated(since = "2.7.7") + public static final String ATTR_UNRELIABLE_KEY = "UNRELIABLE"; + private volatile boolean initialized; + private final DataSourceVO vo; /** @@ -130,6 +132,9 @@ public void removeDataPoint(DataPointRT dataPoint) { abstract public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPointSource source); protected abstract List getDataPoints(); + public boolean isInitialized() { + return initialized; + } public void relinquish(@SuppressWarnings("unused") DataPointRT dataPoint) { throw new ShouldNeverHappenException("not implemented in " + getClass()); @@ -222,9 +227,11 @@ protected static LocalizableMessage getExceptionMessage(Exception e) { // public void initialize() { // no op + this.initialized = true; } public void terminate() { + this.initialized = false; // Remove any outstanding events. Common.ctx.getEventManager().cancelEventsForDataSource(vo.getId()); } diff --git a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java index 51e148c9f4..4360f08ea7 100644 --- a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java @@ -227,7 +227,7 @@ public void addDataPoint(DataPointRT dataPoint) { returnToNormal(dataPoint); } catch (BACnetException e) { - fireMessageExceptionEvent("event.bacnet.whoisPoint", dataPoint.getVO().getName(), e.getMessage()); + fireMessageExceptionEvent(dataPoint,"event.bacnet.whoisPoint", dataPoint.getVO().getName(), e.getMessage()); disablePoint(dataPoint); return; } @@ -257,18 +257,18 @@ public void addDataPoint(DataPointRT dataPoint) { resetUnreliableDataPoint(dataPoint); } catch (BACnetException e) { - // Ignore. + log.warn(LoggingUtils.info(e, this), e); } catch (PropertyValueException e) { setUnreliableDataPoint(dataPoint); // Shouldn't happen, so just log. - log.error("Couldn't manually get segmentation and vendor id from device", e); + log.error("Couldn't manually get segmentation and vendor id from device: " + LoggingUtils.info(e, this)); } } if (d == null) { // If we still don't have the device, call it in. - fireDeviceExceptionEvent("event.bacnet.deviceError", address.toIpString()); + fireDeviceExceptionEvent(dataPoint,"event.bacnet.deviceError", address.toIpString()); disablePoint(dataPoint); } else { @@ -424,16 +424,16 @@ public void forcePointRead(DataPointRT dataPoint) { returnToNormal(dataPoint); } catch (BACnetException e) { - fireMessageExceptionEvent("event.bacnet.readDevice", d.getAddress().toIpString(), e.getMessage()); + fireMessageExceptionEvent(dataPoint, "event.bacnet.readDevice", d.getAddress().toIpString(), e.getMessage()); } } private void dereferencePoint(DataPointRT dp, Encodable encodable, long time) { if (encodable == null) { - fireDeviceExceptionEvent("event.bacnet.readError", dp.getVO().getName(), "no value returned"); + fireDeviceExceptionEvent(dp, "event.bacnet.readError", dp.getVO().getName(), "no value returned"); } else if (encodable instanceof BACnetError) { - fireDeviceExceptionEvent("event.bacnet.readError", dp.getVO().getName(), - ((BACnetError) encodable).getErrorCode()); + fireDeviceExceptionEvent(dp, "event.bacnet.readError", dp.getVO().getName(), + String.valueOf(((BACnetError) encodable).getErrorCode())); } else { MangoValue value = encodableToValue(encodable, dp.getDataTypeId()); dp.updatePointValue(new PointValueTime(value, time)); @@ -459,7 +459,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime pvt, SetPointSou returnToNormal(dataPoint); } catch (Throwable t) { - fireMessageExceptionEvent("event.setPointFailed", t.getMessage()); + fireMessageExceptionEvent(dataPoint, "event.setPointFailed", t.getMessage()); } } @@ -479,7 +479,7 @@ public void relinquish(DataPointRT dataPoint) { forcePointRead(dataPoint); } catch (Throwable t) { - fireMessageExceptionEvent("event.relinquishFailed", t.getMessage()); + fireMessageExceptionEvent(dataPoint, "event.relinquishFailed", t.getMessage()); } } @@ -571,6 +571,7 @@ public void covNotificationReceived(UnsignedInteger subscriberProcessIdentifier, sendCovSubscriptionImpl(initiatingDevice, monitoredObjectIdentifier, covId, true); } catch (BACnetException e) { /* Ignore exceptions */ + log.warn(LoggingUtils.info(e, this), e); } } } @@ -620,7 +621,7 @@ public void receivedThrowable(Throwable t) { public void unimplementedVendorService(UnsignedInteger vendorId, UnsignedInteger serviceNumber, ByteQueue queue) { log.warn("Received unimplemented vendor service: vendor id=" + vendorId + ", service number=" + serviceNumber - + ", bytes (with context id)=" + queue); + + ", bytes (with context id)=" + queue + " : " + LoggingUtils.dataSourceInfo(this)); } // @@ -638,7 +639,7 @@ boolean sendCovSubscription(DataPointRT dataPoint, boolean unsubscribe) { // If we are unsubscribing a failure doesn't really matter since the lease will expire eventually anyway, // so ignore. if (!unsubscribe) { - fireMessageExceptionEvent("event.bacnet.covFailed", + fireMessageExceptionEvent(dataPoint, "event.bacnet.covFailed", locator.getRemoteDevice().getAddress().toIpString(), e.getMessage()); disablePoint(dataPoint); return false; @@ -669,12 +670,16 @@ private void fireMessageExceptionEvent(Throwable t) { log.info("", t); } - private void fireMessageExceptionEvent(String key, Object... args) { - raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, args)); + private void fireMessageExceptionEvent(String key, String... args) { + raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, (Object[]) args)); + } + + private void fireMessageExceptionEvent(DataPointRT dataPointRT, String key, String... args) { + raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, (Object[]) args), dataPointRT); } - private void fireDeviceExceptionEvent(String key, Object... args) { - raiseEvent(DEVICE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, args)); + private void fireDeviceExceptionEvent(DataPointRT dataPointRT, String key, String... args) { + raiseEvent(DEVICE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, (Object[]) args), dataPointRT); } private void returnToNormal() { @@ -799,4 +804,9 @@ else if (value instanceof AlphanumericValue) { throw new ShouldNeverHappenException("Unknown data type: " + value.getClass().getName()); } + + @Override + public boolean isInitialized() { + return initialized; + } } diff --git a/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java index 6f8ffca681..2a0c7bd624 100644 --- a/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java @@ -65,8 +65,10 @@ synchronized protected void doPoll(long time) { if (socket == null) { try { openConnection(); - } - catch (IOException e) { + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); + } catch (Throwable messageException) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.pollingError", + messageException.getMessage())); return; } } @@ -83,16 +85,14 @@ synchronized protected void doPoll(long time) { try { sendMsg = sendRequest(request, dataPoint, locator, time); - } - catch (IOException e) { + } catch (Throwable e) { // The connection may have been reset, so try to reopen it and attempt the message again. try { - LOG.debug("Keep-alive connection may have been reset. Attempting to re-open."); + LOG.warn("Keep-alive connection may have been reset. Attempting to re-open."); closeConnection(); openConnection(); sendMsg = sendRequest(request, dataPoint, locator, time); - } - catch (Exception e2) { + } catch (Exception e2) { messageException = e2; closeConnection(); break; @@ -105,10 +105,10 @@ synchronized protected void doPoll(long time) { } if (messageException != null) { + LOG.info("Error while polling Galil device", messageException); // Raise an event. raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.pollingError", messageException.getMessage())); - LOG.info("Error while polling Galil device", messageException); } else // Deactivate any existing event. @@ -156,11 +156,12 @@ public void initialize() { returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Exception e) { + LOG.warn("Error while initializing data source", e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); - LOG.debug("Error while initializing data source", e); return; } + super.initialize(); } @Override @@ -181,33 +182,33 @@ synchronized public void setPointValue(DataPointRT dataPoint, PointValueTime val if (socket == null) { try { openConnection(); - } - catch (IOException e) { + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); + } catch (Throwable e) { + LOG.warn("Error while initializing data source", e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.galil.setPointFailed", dataPoint.getVO().getName(), e.getMessage()), dataPoint); - LOG.debug("Error while initializing data source", e); return; } - returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } GalilPointLocatorRT locator = dataPoint.getPointLocator(); GalilRequest request = locator.getSetRequest(valueTime.getValue()); if (request == null) - raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage( + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.galil.setRequest", dataPoint.getVO().getName(), valueTime.getValue()), dataPoint); else { try { GalilResponse response = (GalilResponse) conn.send(request); if (response.isErrorResponse()) - raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage( + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.galil.setResponse", dataPoint.getVO().getName()), dataPoint); else { try { // Update the data image with the new value. dataPoint.updatePointValue(new PointValueTime(valueTime.getValue(), valueTime.getTime())); + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); MangoValue value = locator.parseSetResponse(response.getResponseData()); if (value != null) @@ -215,14 +216,14 @@ synchronized public void setPointValue(DataPointRT dataPoint, PointValueTime val dataPoint.updatePointValue(new PointValueTime(value, System.currentTimeMillis())); } catch (LocalizableException e) { - raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), false, + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage("event.galil.parsingError", dataPoint.getVO().getName(), response.getResponseData()), dataPoint); } } } - catch (IOException e) { - raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage( + catch (Throwable e) { + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.galil.sendError", dataPoint.getVO().getName(), e.getMessage()), dataPoint); } } diff --git a/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java b/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java index dff108715d..833632c5c8 100644 --- a/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java +++ b/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java @@ -265,7 +265,7 @@ void execute(long runtime, List sourceIds) { } } catch (ScriptException e) { - handleError(runtime, new LocalizableMessage("common.default", e.getMessage())); + handleError(runtime, new LocalizableMessage("common.default", e.getLocalizedMessage())); LOG.warn(infoErrorExecutionScript(e, dataPoint, dataSource)); } catch (ResultTypeException e) { @@ -273,8 +273,8 @@ void execute(long runtime, List sourceIds) { LOG.warn(infoErrorExecutionScript(e, dataPoint, dataSource)); } catch (Exception e) { + handleError(runtime, new LocalizableMessage("common.default", e.getMessage())); LOG.warn(infoErrorExecutionScript(e, dataPoint, dataSource)); - throw e; } } finally { @@ -287,6 +287,7 @@ private void createContext() { try { ScriptExecutor scriptExecutor = new ScriptExecutor(); context = scriptExecutor.convertContext(vo.getContext()); + returnToNormal(System.currentTimeMillis()); } catch (Exception e) { handleError(System.currentTimeMillis(), new LocalizableMessage("common.default", e.getMessage())); LOG.warn(infoErrorInitializationScript(e, dataPoint, dataSource)); @@ -317,10 +318,14 @@ private void execute(PointValueTime newValue) { protected void updatePoint(PointValueTime pvt) { dataPoint.updatePointValue(pvt); - dataSource.returnToNormalScript(pvt.getTime(), dataPoint); + returnToNormal(System.currentTimeMillis()); } protected void handleError(long runtime, LocalizableMessage message) { dataSource.raiseScriptError(runtime, dataPoint, message); } + + protected void returnToNormal(long runtime) { + dataSource.returnToNormalScript(runtime, dataPoint); + } } diff --git a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java index 4940915343..b6d7ab015d 100644 --- a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; +import com.serotonin.mango.util.LoggingUtils; import com.serotonin.modbus4j.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -60,6 +61,7 @@ abstract public class ModbusDataSource extends PollingDataSource implements public static final int POINT_READ_EXCEPTION_EVENT = 1; public static final int POINT_WRITE_EXCEPTION_EVENT = 2; public static final int DATA_SOURCE_EXCEPTION_EVENT = 3; + public static final int MONITOR_WRITE_EXCEPTION_EVENT = 4; private ModbusMaster modbusMaster; private BatchRead batchRead; @@ -190,6 +192,9 @@ protected void doPoll(long time) { } } } catch (Exception e) { + LOG.warn(LoggingUtils.info(e, this)); + setUnreliableDataPoints(dataPoints); + return; } try { @@ -208,12 +213,12 @@ protected void doPoll(long time) { if (result instanceof ExceptionResult) { ExceptionResult exceptionResult = (ExceptionResult) result; - LOG.trace("Point: " + locator.getVO().getOffset() + LOG.warn("Point: " + locator.getVO().getOffset() + " Exception: " + exceptionResult.getExceptionMessage()); if (exceptionResult.getExceptionMessage().contains( "no active connection")) { - LOG.trace("Cannot reach source, setting monitors to false"); + LOG.warn("Cannot reach source, setting monitors to false"); slaveStatuses.put(locator.getVO().getSlaveId(), false); } else { // Raise an event. @@ -254,8 +259,6 @@ protected void doPoll(long time) { slaveStatuses.put(locator.getVO().getSlaveId(), false); dataSourceExceptions = true; - - setUnreliableDataPoint(dataPoint); } else { /* * When an event is raised from the Callback @@ -271,7 +274,7 @@ protected void doPoll(long time) { * it´s effective. TODO: Treat this type of exception * only... but how?! */ - LOG.trace("Point: " + locator.getVO().getOffset() + LOG.warn("Point: " + locator.getVO().getOffset() + " eventRaised: " + eventRaised); if (!eventRaised) { updatePointValue(dataPoint, locator, result, time); @@ -304,8 +307,14 @@ protected void doPoll(long time) { if (oldOnline != newOnline) { LOG.trace("Monitor.setPointValue(): " + newOnline); - monitor.setPointValue(new PointValueTime(newOnline, - time), null); + try { + monitor.setPointValue(new PointValueTime(newOnline, + time), null); + returnToNormal(MONITOR_WRITE_EXCEPTION_EVENT, time, monitor); + } catch (Exception e) { + raiseEvent(MONITOR_WRITE_EXCEPTION_EVENT, time, true, + getLocalExceptionMessage(e), monitor); + } } } } diff --git a/src/com/serotonin/mango/rt/dataSource/onewire/OneWireDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/onewire/OneWireDataSourceRT.java index c42f4021ba..aee6c19a59 100644 --- a/src/com/serotonin/mango/rt/dataSource/onewire/OneWireDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/onewire/OneWireDataSourceRT.java @@ -391,7 +391,6 @@ else if (attributeId == OneWirePointLocatorVO.AttributeTypes.WIPER_POSITION) { @Override public void initialize() { initializeNetwork(); - super.initialize(); } @Override @@ -421,6 +420,7 @@ private void initializeNetwork() { terminateNetwork(); return; } + super.initialize(); } private void terminateNetwork() { diff --git a/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java index 7b1ff0d15b..f9d0a60c0e 100644 --- a/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java @@ -98,8 +98,6 @@ public long getPacketsReceived(int index) { // @Override public void initialize() { - super.initialize(); - try { serverSocket = new ServerSocket(vo.getPort()); serverSocket.setSoTimeout(2000); @@ -110,7 +108,9 @@ public void initialize() { serverSocket = null; raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); + return; } + super.initialize(); } @Override diff --git a/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java index bae9c8dc7e..c6bd7706c3 100644 --- a/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java @@ -340,7 +340,7 @@ void receivedTrap(PDU trap) { // Take a look at the response. LocalizableMessage message = validatePdu(trap); if (message != null) { - raiseEvent(PDU_EXCEPTION_EVENT, time, false, message); + raiseEvent(PDU_EXCEPTION_EVENT, time, true, message); } else { synchronized (pointListChangeLock) { updateChangedPoints(); @@ -358,8 +358,10 @@ void receivedTrap(PDU trap) { } if (!found) { - raiseEvent(TRAP_NOT_HANDLED_EVENT, time, false, new LocalizableMessage("event.snmp.trapNotHandled", vb)); log.warn("Trap not handled: " + vb); + raiseEvent(TRAP_NOT_HANDLED_EVENT, time, true, new LocalizableMessage("event.snmp.trapNotHandled", vb)); + } else { + returnToNormal(TRAP_NOT_HANDLED_EVENT, time); } } } diff --git a/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java index ce493cd04d..53637ee9bc 100644 --- a/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java @@ -412,7 +412,7 @@ public void viconicsReceivedException(Exception e) { raiseEvent( MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), - false, + true, new LocalizableMessage("event.viconics.messagingException", e .getMessage())); } @@ -463,7 +463,7 @@ public void viconicsDevicePointUpdated(ViconicsDevice device, public void viconicsDuplicateCommAddressDetected(int commAddress) { raiseEvent(DUPLICATE_COMM_ADDRESS_EVENT, System.currentTimeMillis(), - false, new LocalizableMessage( + true, new LocalizableMessage( "event.viconics.messagingException", commAddress)); } @@ -517,7 +517,7 @@ public void forcePointRead(DataPointRT dataPoint) { raiseEvent( MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), - false, + true, new LocalizableMessage("event.readPointFailed", e .getMessage()), dataPoint); } diff --git a/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java index e2cfd42874..bb36105dde 100644 --- a/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java @@ -60,7 +60,6 @@ public VMStatDataSourceRT(VMStatDataSourceVO vo) { // @Override public void initialize() { - super.initialize(); String command = "vmstat -n "; switch (vo.getOutputScale()) { @@ -143,7 +142,9 @@ else if ("st".equals(headerParts[i])) catch (IOException e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); + return; } + super.initialize(); } @Override diff --git a/src/com/serotonin/mango/util/LoggingUtils.java b/src/com/serotonin/mango/util/LoggingUtils.java index e73c9d637f..44c0edebae 100644 --- a/src/com/serotonin/mango/util/LoggingUtils.java +++ b/src/com/serotonin/mango/util/LoggingUtils.java @@ -68,7 +68,7 @@ public static String scriptInfo(ScriptVO script) { return MessageFormat.format(info, script.getName(), String.valueOf(script.getId()), script.getXid()); } - public static String exceptionInfo(Exception ex) { + public static String exceptionInfo(Throwable ex) { if(ex == null) return ""; String info = "exception: {0} (msg: {1})"; @@ -210,11 +210,11 @@ public static String entryInfo(PointValueService.BatchWriteBehindEntry entry) { return MessageFormat.format(info, entry.getPointId(), entry.getDataType(), entry.getTime(), entry.getDvalue()); } - public static String info(Exception e, DataSourceRT dataSourceRT) { + public static String info(Throwable e, DataSourceRT dataSourceRT) { return exceptionInfo(e) + " - " + dataSourceInfo(dataSourceRT); } - public static String info(Exception e, DataSourceRT dataSourceRT, DataPointRT dataPointRT) { + public static String info(Throwable e, DataSourceRT dataSourceRT, DataPointRT dataPointRT) { return exceptionInfo(e) + " - " + dataSourceInfo(dataSourceRT) + " - " + dataPointInfo(dataPointRT); } diff --git a/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java b/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java index 78d5c48d94..ff7e0b4ad5 100644 --- a/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java +++ b/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java @@ -52,6 +52,8 @@ protected void addEventTypes(List ets) { new LocalizableMessage("event.ds.pointRead"))); ets.add(createEventType(ModbusDataSource.POINT_WRITE_EXCEPTION_EVENT, new LocalizableMessage("event.ds.pointWrite"))); + ets.add(createEventType(ModbusDataSource.MONITOR_WRITE_EXCEPTION_EVENT, + new LocalizableMessage("event.ds.monitorWrite"))); } private static final ExportCodes EVENT_CODES = new ExportCodes(); @@ -62,6 +64,8 @@ protected void addEventTypes(List ets) { "POINT_READ_EXCEPTION"); EVENT_CODES.addElement(ModbusDataSource.POINT_WRITE_EXCEPTION_EVENT, "POINT_WRITE_EXCEPTION"); + EVENT_CODES.addElement(ModbusDataSource.MONITOR_WRITE_EXCEPTION_EVENT, + "MONITOR_WRITE_EXCEPTION"); } @Override diff --git a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java index 92bfb62a2a..70e5477867 100644 --- a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java +++ b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java @@ -76,6 +76,7 @@ public void initialize() { LOG.error(exceptionInfo(e), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e)); + return; } super.initialize(); } diff --git a/src/org/scada_lts/utils/MetaDataPointUtils.java b/src/org/scada_lts/utils/MetaDataPointUtils.java new file mode 100644 index 0000000000..6c3486438f --- /dev/null +++ b/src/org/scada_lts/utils/MetaDataPointUtils.java @@ -0,0 +1,36 @@ +package org.scada_lts.utils; + +import com.serotonin.db.IntValuePair; +import com.serotonin.mango.rt.dataImage.DataPointRT; +import com.serotonin.mango.rt.dataSource.meta.MetaPointLocatorRT; +import com.serotonin.mango.vo.dataSource.meta.MetaPointLocatorVO; + +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + + +public final class MetaDataPointUtils { + + private MetaDataPointUtils() {} + + public static boolean isDataPointInContext(DataPointRT dataPoint, int dataPointInContextId) { + if (isMetaDataPointRT(dataPoint)) { + MetaPointLocatorRT metaPointLocatorRT = dataPoint.getPointLocator(); + if(metaPointLocatorRT != null) { + MetaPointLocatorVO metaPointLocatorVO = metaPointLocatorRT.getPointLocatorVO(); + if(metaPointLocatorVO != null && metaPointLocatorVO.getContext() != null) { + Set keys = metaPointLocatorVO.getContext().stream() + .map(IntValuePair::getKey) + .collect(Collectors.toSet()); + return keys.contains(dataPointInContextId); + } + } + } + return false; + } + + public static boolean isMetaDataPointRT(DataPointRT dataPoint) { + return Objects.nonNull(dataPoint) && dataPoint.getPointLocator() instanceof MetaPointLocatorRT; + } +} diff --git a/test/messages_de.properties b/test/messages_de.properties index 2b5b9e6739..46141027d5 100644 --- a/test/messages_de.properties +++ b/test/messages_de.properties @@ -3334,4 +3334,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/test/messages_en.properties b/test/messages_en.properties index 2c75526a76..1e1987cf0b 100644 --- a/test/messages_en.properties +++ b/test/messages_en.properties @@ -3337,4 +3337,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/test/messages_es.properties b/test/messages_es.properties index 4039c70224..ff6551e0bc 100644 --- a/test/messages_es.properties +++ b/test/messages_es.properties @@ -3377,4 +3377,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/test/messages_fi.properties b/test/messages_fi.properties index f3d9c7b23a..8f3327f2da 100644 --- a/test/messages_fi.properties +++ b/test/messages_fi.properties @@ -3463,4 +3463,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/test/messages_fr.properties b/test/messages_fr.properties index b37b69350f..31090fc6e8 100644 --- a/test/messages_fr.properties +++ b/test/messages_fr.properties @@ -3331,4 +3331,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/test/messages_lu.properties b/test/messages_lu.properties index fcffdadd8d..64ad6c32d1 100644 --- a/test/messages_lu.properties +++ b/test/messages_lu.properties @@ -3350,4 +3350,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/test/messages_nl.properties b/test/messages_nl.properties index dc9ff02d3b..65ca74d049 100644 --- a/test/messages_nl.properties +++ b/test/messages_nl.properties @@ -3453,4 +3453,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/test/messages_pl.properties b/test/messages_pl.properties index d41ffc1c60..f87c24c114 100644 --- a/test/messages_pl.properties +++ b/test/messages_pl.properties @@ -3476,3 +3476,4 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/test/messages_pt.properties b/test/messages_pt.properties index eb16fbfd9a..519e7c87d6 100644 --- a/test/messages_pt.properties +++ b/test/messages_pt.properties @@ -3489,4 +3489,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/test/messages_ru.properties b/test/messages_ru.properties index b99c28e26f..e29966e7c2 100644 --- a/test/messages_ru.properties +++ b/test/messages_ru.properties @@ -3485,4 +3485,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/test/messages_zh.properties b/test/messages_zh.properties index 25c80922a9..e92e77add9 100644 --- a/test/messages_zh.properties +++ b/test/messages_zh.properties @@ -3438,4 +3438,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/log4j2.xml b/webapp-resources/log4j2.xml index 4d87c0afb0..60a337baf5 100644 --- a/webapp-resources/log4j2.xml +++ b/webapp-resources/log4j2.xml @@ -34,6 +34,8 @@ ERROR ERROR ERROR + WARN + WARN ERROR @@ -249,6 +251,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapp-resources/messages_de.properties b/webapp-resources/messages_de.properties index 2b5b9e6739..46141027d5 100644 --- a/webapp-resources/messages_de.properties +++ b/webapp-resources/messages_de.properties @@ -3334,4 +3334,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/messages_en.properties b/webapp-resources/messages_en.properties index 2c75526a76..1e1987cf0b 100644 --- a/webapp-resources/messages_en.properties +++ b/webapp-resources/messages_en.properties @@ -3337,4 +3337,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/messages_es.properties b/webapp-resources/messages_es.properties index 4039c70224..ff6551e0bc 100644 --- a/webapp-resources/messages_es.properties +++ b/webapp-resources/messages_es.properties @@ -3377,4 +3377,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/messages_fi.properties b/webapp-resources/messages_fi.properties index f3d9c7b23a..8f3327f2da 100644 --- a/webapp-resources/messages_fi.properties +++ b/webapp-resources/messages_fi.properties @@ -3463,4 +3463,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/messages_fr.properties b/webapp-resources/messages_fr.properties index b37b69350f..31090fc6e8 100644 --- a/webapp-resources/messages_fr.properties +++ b/webapp-resources/messages_fr.properties @@ -3331,4 +3331,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/messages_lu.properties b/webapp-resources/messages_lu.properties index fcffdadd8d..64ad6c32d1 100644 --- a/webapp-resources/messages_lu.properties +++ b/webapp-resources/messages_lu.properties @@ -3350,4 +3350,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/messages_nl.properties b/webapp-resources/messages_nl.properties index dc9ff02d3b..65ca74d049 100644 --- a/webapp-resources/messages_nl.properties +++ b/webapp-resources/messages_nl.properties @@ -3453,4 +3453,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/messages_pl.properties b/webapp-resources/messages_pl.properties index d41ffc1c60..f87c24c114 100644 --- a/webapp-resources/messages_pl.properties +++ b/webapp-resources/messages_pl.properties @@ -3476,3 +3476,4 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/messages_pt.properties b/webapp-resources/messages_pt.properties index eb16fbfd9a..519e7c87d6 100644 --- a/webapp-resources/messages_pt.properties +++ b/webapp-resources/messages_pt.properties @@ -3489,4 +3489,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/messages_ru.properties b/webapp-resources/messages_ru.properties index b99c28e26f..e29966e7c2 100644 --- a/webapp-resources/messages_ru.properties +++ b/webapp-resources/messages_ru.properties @@ -3485,4 +3485,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file diff --git a/webapp-resources/messages_zh.properties b/webapp-resources/messages_zh.properties index 25c80922a9..e92e77add9 100644 --- a/webapp-resources/messages_zh.properties +++ b/webapp-resources/messages_zh.properties @@ -3438,4 +3438,5 @@ common.addPoint=Add point systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" -systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" \ No newline at end of file +systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" +event.ds.monitorWrite=Monitor write exception \ No newline at end of file From baf2367d7bac4117ae513c55b14d9b3761e5607c Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Wed, 21 Feb 2024 21:22:40 +0100 Subject: [PATCH 07/63] #2798 Corrected History Annotation Change Point Value By User: - corrected terminate method for: Alpha2DataSource, Dnp3DataSource, DrStorageHt5bDataSource, IEC101DataSource, OPCDataSource, RadiuinoEventDataSource, RadiuinoPollingDataSource; - fixed reset unreliable HttpImageDataSourceRT when error retriever; - refactor DataPointUnreliableUtils; - fixed RuntimeManager.startDataPoint; --- .../dataSource/alpha2/Alpha2DataSource.java | 11 ++++--- .../rt/dataSource/dnp3/Dnp3DataSource.java | 3 +- .../DrStorageHt5bDataSource.java | 4 ++- .../dataSource/iec101/IEC101DataSource.java | 5 ++- .../rt/dataSource/opc/OPCDataSource.java | 5 ++- .../radiuino/RadiuinoEventDataSource.java | 11 ++++++- .../radiuino/RadiuinoPollingDataSource.java | 11 ++++++- .../serotonin/mango/rt/RuntimeManager.java | 4 +-- .../dataSource/DataPointUnreliableUtils.java | 31 +++++++------------ .../http/HttpImageDataSourceRT.java | 6 ++-- webapp-resources/messages_de.properties | 3 +- webapp-resources/messages_en.properties | 3 +- webapp-resources/messages_es.properties | 3 +- webapp-resources/messages_fi.properties | 3 +- webapp-resources/messages_fr.properties | 3 +- webapp-resources/messages_lu.properties | 3 +- webapp-resources/messages_nl.properties | 3 +- webapp-resources/messages_pl.properties | 3 +- webapp-resources/messages_pt.properties | 3 +- webapp-resources/messages_ru.properties | 3 +- webapp-resources/messages_zh.properties | 3 +- 21 files changed, 79 insertions(+), 45 deletions(-) diff --git a/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java b/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java index 7b20b0553d..6e92af5a81 100644 --- a/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java @@ -140,7 +140,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, master.write(devices); returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } - } catch (Exception e) { + } catch (Throwable e) { treatException(POINT_WRITE_EXCEPTION_EVENT, e, System.currentTimeMillis(), dataPoint); } @@ -161,7 +161,7 @@ public void initialize() { master.init(); master.lineCheck(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { + } catch (Throwable e) { treatException(DATA_SOURCE_EXCEPTION_EVENT, e, System .currentTimeMillis()); return; @@ -174,7 +174,8 @@ public void initialize() { public void terminate() { super.terminate(); try { - master.terminate(); + if(master != null) + master.terminate(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this), e); @@ -184,7 +185,7 @@ public void terminate() { } } - private void treatException(int exceptionType, Exception e, long time) { + private void treatException(int exceptionType, Throwable e, long time) { LOG.warn(LoggingUtils.info(e, this), e); if (e instanceof COMMException) { raiseEvent(exceptionType, time, true, new LocalizableMessage( @@ -203,7 +204,7 @@ private void treatException(int exceptionType, Exception e, long time) { } } - private void treatException(int exceptionType, Exception e, long time, DataPointRT dataPointRT) { + private void treatException(int exceptionType, Throwable e, long time, DataPointRT dataPointRT) { LOG.warn(LoggingUtils.info(e, this), e); if (e instanceof COMMException) { raiseEvent(exceptionType, time, true, new LocalizableMessage( diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java index 046da47c4c..664a9b21e1 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java @@ -83,7 +83,8 @@ protected void initialize(DNP3Master dnp3Master) { public void terminate() { super.terminate(); try { - dnp3Master.terminate(); + if(dnp3Master != null) + dnp3Master.terminate(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this), e); diff --git a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java index 2ca2bb357d..5c56b471bb 100644 --- a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java @@ -120,7 +120,9 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, public void terminate() { super.terminate(); try { - getsPort().close(); + SerialPort serialPort = getsPort(); + if(serialPort != null) + serialPort.close(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, diff --git a/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java b/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java index d107941319..73d6cc0578 100644 --- a/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java @@ -39,6 +39,8 @@ public IEC101DataSource(IEC101DataSourceVO vo) { @Override protected void doPoll(long time) { try { + if(iec101Master == null) + throw new IllegalStateException("Data source is not initialized!"); iec101Master.doPoll(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Exception e) { @@ -138,7 +140,8 @@ protected void initialize(IEC101Master iec101Master) { public void terminate() { super.terminate(); try { - iec101Master.terminate(); + if(iec101Master != null) + iec101Master.terminate(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this), e); diff --git a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java index 504d750532..f46c395c80 100644 --- a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java @@ -113,6 +113,7 @@ else if (dataPoint.getDataTypeId() == DataTypes.MULTISTATE) try { opcMaster.write(tag, value); + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this, dataPoint), e); raiseEvent( @@ -158,7 +159,9 @@ public void initialize() { public void terminate() { super.terminate(); try { - opcMaster.terminate(); + if(opcMaster != null) + opcMaster.terminate(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { String message = e.getMessage(); if(e instanceof NullPointerException) { diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java index c08f2fd3e3..7fca33b1f8 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java @@ -97,7 +97,16 @@ public void initialize() { @Override public void terminate() { super.terminate(); - getsPort().close(); + try { + SerialPort serialPort = getsPort(); + if(serialPort != null) + serialPort.close(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + } LOG.debug("Terminando o Radiuino Polling Data Source."); } diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java index 15ded1b269..90807c0e9d 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java @@ -175,7 +175,16 @@ public void initialize() { @Override public void terminate() { super.terminate(); - getsPort().close(); + try { + SerialPort serialPort = getsPort(); + if(serialPort != null) + serialPort.close(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + } LOG.debug("Terminando o Radiuino Polling Data Source."); } diff --git a/src/com/serotonin/mango/rt/RuntimeManager.java b/src/com/serotonin/mango/rt/RuntimeManager.java index b58f1e36b3..41598f8b52 100644 --- a/src/com/serotonin/mango/rt/RuntimeManager.java +++ b/src/com/serotonin/mango/rt/RuntimeManager.java @@ -491,10 +491,10 @@ private void startDataPoint(DataPointVO vo) { // Add/update it in the data source. ds.addDataPoint(dataPoint); - boolean reliable = isReliable(dataPoint); + boolean reliable = isReliable(dataPoint, ds); if(reliable) resetUnreliableDataPoint(dataPoint); - else if(!ds.isInitialized()) + else setUnreliableDataPoint(dataPoint); LOG.info("Data point '" + vo.getExtendedName() + "' initialized - reliable: " + reliable); diff --git a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java index 0817818ada..7449fb067b 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java +++ b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java @@ -7,7 +7,6 @@ import java.util.Collections; import java.util.List; -import java.util.function.*; import java.util.stream.Collectors; public final class DataPointUnreliableUtils { @@ -18,38 +17,36 @@ public final class DataPointUnreliableUtils { private DataPointUnreliableUtils() {} + public static boolean isReliable(DataPointRT dataPoint, DataSourceRT dataSource) { + return dataSource.isInitialized() && (!isSetUnreliable(dataPoint, true) || isSetUnreliable(dataPoint, false)); + } public static void setUnreliableDataPoints(List dataPoints) { - unreliable(dataPoints, DataPointUnreliableUtils::setAttributes, - Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, true, 9); + unreliable(dataPoints, true, 9); } public static void setUnreliableDataPoint(DataPointRT dataPoint) { - unreliable(Collections.singletonList(dataPoint), DataPointUnreliableUtils::setAttributes, - Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, true, 9); + unreliable(Collections.singletonList(dataPoint), true, 9); } public static void resetUnreliableDataPoints(List dataPoints) { - unreliable(dataPoints, DataPointUnreliableUtils::setAttributes, - Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, false, 9); + unreliable(dataPoints, false, 9); } public static void resetUnreliableDataPoint(DataPointRT dataPoint) { - unreliable(Collections.singletonList(dataPoint), DataPointUnreliableUtils::setAttributes, - Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, false, 9); + unreliable(Collections.singletonList(dataPoint), false, 9); } - private static void unreliable(List dataPoints, BiConsumer, Boolean> setList, - IntFunction> getData, boolean unreliable, int safe) { - setList.accept(filter(dataPoints, unreliable), unreliable); + private static void unreliable(List dataPoints, boolean unreliable, int safe) { + setAttributes(filter(dataPoints, unreliable), unreliable); for(DataPointRT dataPoint: dataPoints) { - List metaDataPoints = getData.apply(dataPoint.getId()); + List metaDataPoints = Common.ctx.getRuntimeManager().getRunningMetaDataPoints(dataPoint.getId()); if(!metaDataPoints.isEmpty()) { if(safe > -1) - unreliable(metaDataPoints, setList, getData, unreliable, --safe); + unreliable(metaDataPoints, unreliable, --safe); else { LOG.warn("The safe counter has been exceeded!"); - setList.accept(filter(metaDataPoints, unreliable), unreliable); + setAttributes(filter(metaDataPoints, unreliable), unreliable); } } } @@ -70,8 +67,4 @@ private static boolean isSetUnreliable(DataPointRT dataPoint, boolean unreliable return dataPoint.getAttribute(ATTR_UNRELIABLE_KEY) != null && ((boolean) dataPoint.getAttribute(ATTR_UNRELIABLE_KEY)) == unreliable; } - - public static boolean isReliable(DataPointRT dataPoint) { - return !isSetUnreliable(dataPoint, true) || isSetUnreliable(dataPoint, false); - } } \ No newline at end of file diff --git a/src/com/serotonin/mango/rt/dataSource/http/HttpImageDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/http/HttpImageDataSourceRT.java index 89468b4d9b..bf76802ea4 100644 --- a/src/com/serotonin/mango/rt/dataSource/http/HttpImageDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/http/HttpImageDataSourceRT.java @@ -90,10 +90,12 @@ protected void doPoll(long time) { } // Check the results. - if (monitor.getRetrievalFailure() != null) + if (monitor.getRetrievalFailure() != null) { raiseEvent(DATA_RETRIEVAL_FAILURE_EVENT, time, true, monitor.getRetrievalFailure()); - else + return; + } else { returnToNormal(DATA_RETRIEVAL_FAILURE_EVENT, time); + } if (monitor.getSaveFailure() != null) raiseEvent(FILE_SAVE_EXCEPTION_EVENT, time, true, monitor.getSaveFailure()); diff --git a/webapp-resources/messages_de.properties b/webapp-resources/messages_de.properties index 46141027d5..5f0f20fccf 100644 --- a/webapp-resources/messages_de.properties +++ b/webapp-resources/messages_de.properties @@ -3335,4 +3335,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_en.properties b/webapp-resources/messages_en.properties index 1e1987cf0b..61da0f7764 100644 --- a/webapp-resources/messages_en.properties +++ b/webapp-resources/messages_en.properties @@ -3338,4 +3338,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_es.properties b/webapp-resources/messages_es.properties index ff6551e0bc..0468e96676 100644 --- a/webapp-resources/messages_es.properties +++ b/webapp-resources/messages_es.properties @@ -3378,4 +3378,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_fi.properties b/webapp-resources/messages_fi.properties index 8f3327f2da..586b18cdf3 100644 --- a/webapp-resources/messages_fi.properties +++ b/webapp-resources/messages_fi.properties @@ -3464,4 +3464,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_fr.properties b/webapp-resources/messages_fr.properties index 31090fc6e8..98145f908b 100644 --- a/webapp-resources/messages_fr.properties +++ b/webapp-resources/messages_fr.properties @@ -3332,4 +3332,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_lu.properties b/webapp-resources/messages_lu.properties index 64ad6c32d1..e2d67d6290 100644 --- a/webapp-resources/messages_lu.properties +++ b/webapp-resources/messages_lu.properties @@ -3351,4 +3351,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_nl.properties b/webapp-resources/messages_nl.properties index 65ca74d049..27cb445a41 100644 --- a/webapp-resources/messages_nl.properties +++ b/webapp-resources/messages_nl.properties @@ -3454,4 +3454,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_pl.properties b/webapp-resources/messages_pl.properties index f87c24c114..7c023cd1a0 100644 --- a/webapp-resources/messages_pl.properties +++ b/webapp-resources/messages_pl.properties @@ -3476,4 +3476,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_pt.properties b/webapp-resources/messages_pt.properties index 519e7c87d6..2857203574 100644 --- a/webapp-resources/messages_pt.properties +++ b/webapp-resources/messages_pt.properties @@ -3490,4 +3490,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_ru.properties b/webapp-resources/messages_ru.properties index e29966e7c2..5d9e6195e8 100644 --- a/webapp-resources/messages_ru.properties +++ b/webapp-resources/messages_ru.properties @@ -3486,4 +3486,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_zh.properties b/webapp-resources/messages_zh.properties index e92e77add9..dcb0f9ed12 100644 --- a/webapp-resources/messages_zh.properties +++ b/webapp-resources/messages_zh.properties @@ -3439,4 +3439,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file From 59772a7484a818f28c55c291fedd687a134e176d Mon Sep 17 00:00:00 2001 From: Kamil Date: Tue, 27 Feb 2024 01:14:59 +0100 Subject: [PATCH 08/63] #2755 Signaling the data source that has a problem: - added tests: InitializeDataSourceRtTest, InitializeWithErrorsDataSourceRtTest; - corrected test: DataPointUnreliableUtilsTest; - replacing class CommPortIdentifier from RXTXcomm.jar with a new class ScadaCommPortIdentifier: ASCIISerialDataSource, DrStorageHt5bDataSource, RadiuinoEventDataSource, RadiuinoPollingDataSource; - corrected signaling errors in: BACnetIPDataSourceRT, HttpReceiverDataSourceRT, ModbusDataSource, NmeaDataSourceRT, PachubeDataSourceRT, PersistentDataSourceRT, SnmpDataSourceRT, ViconicsDataSourceRT; - try catch Throwable; - change logging level from WARN to ERROR for dataSourceRtLoggingLevel, dataPointRtLoggingLevel (log4j2.xml); - refactoring DataPointUnreliableUtils; - added methods: DataPointRT.isUnreliable, DataPointRT.isSetUnreliable, DataSourceUtils.checkInitialized; --- build.gradle | 1 + .../asciiSerial/ASCIISerialDataSource.java | 5 +- .../rt/dataSource/dnp3/Dnp3DataSource.java | 20 +- .../dataSource/dnp3/Dnp3SerialDataSource.java | 6 +- .../DrStorageHt5bDataSource.java | 3 +- .../rt/dataSource/opc/OPCDataSource.java | 14 +- .../radiuino/RadiuinoEventDataSource.java | 5 +- .../radiuino/RadiuinoPollingDataSource.java | 5 +- src/com/serotonin/mango/Common.java | 3 +- .../serotonin/mango/rt/RuntimeManager.java | 11 +- .../mango/rt/dataImage/DataPointRT.java | 12 + .../dataSource/DataPointUnreliableUtils.java | 10 +- .../mango/rt/dataSource/DataSourceRT.java | 4 +- .../mango/rt/dataSource/DataSourceUtils.java | 6 + .../bacnet/BACnetIPDataSourceRT.java | 15 +- .../http/HttpReceiverDataSourceRT.java | 20 +- .../dataSource/modbus/ModbusDataSource.java | 48 +- .../modbus/ModbusSerialDataSource.java | 2 +- .../rt/dataSource/nmea/NmeaDataSourceRT.java | 7 +- .../pachube/PachubeDataSourceRT.java | 41 +- .../persistent/PersistentDataSourceRT.java | 2 +- .../rt/dataSource/snmp/SnmpDataSourceRT.java | 16 +- .../viconics/ViconicsDataSourceRT.java | 8 +- .../serotonin/mango/util/LoggingUtils.java | 6 +- .../http/HttpReceiverDataSourceVO.java | 10 +- .../pachube/PachubeDataSourceVO.java | 4 + .../ds/messaging/MessagingDataSourceRT.java | 38 +- .../channel/InitMessagingChannels.java | 2 +- .../channel/MessagingChannelsImpl.java | 6 +- .../channel/NonSyncOperationChannels.java | 2 +- .../channel/SyncOperationChannels.java | 8 +- .../channel/UpdatePointValueConsumer.java | 6 +- .../amqp/client/AmqpChannelFactory.java | 4 +- .../amqp/client/AmqpMessagingChannel.java | 4 +- .../amqp/client/AmqpMessagingChannels.java | 24 +- .../mqtt/client/MqttMessagingChannel.java | 6 +- .../mqtt/client/MqttMessagingChannels.java | 26 +- .../messaging/service/MessagingService.java | 2 +- .../service/MessagingServiceImpl.java | 24 +- .../gnu/io/ScadaCommPortIdentifier.java | 11 + test/br/org/scadabr/db/utils/TestUtils.java | 30 +- .../DataPointUnreliableUtilsTest.java | 547 ++++++++++++++---- .../InitializeDataSourceRtTest.java | 241 ++++++++ .../InitializeDataSourceRtTestsSuite.java | 12 + .../InitializeWithErrorsDataSourceRtTest.java | 213 +++++++ .../util/InitializeDataSourceRtMockUtils.java | 443 ++++++++++++++ webapp-resources/log4j2.xml | 4 +- 47 files changed, 1646 insertions(+), 291 deletions(-) create mode 100644 src/org/scada_lts/serial/gnu/io/ScadaCommPortIdentifier.java create mode 100644 test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java create mode 100644 test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java create mode 100644 test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java create mode 100644 test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java diff --git a/build.gradle b/build.gradle index b43c8d11a0..5fb6422fb4 100644 --- a/build.gradle +++ b/build.gradle @@ -206,5 +206,6 @@ test { includeTestsMatching "org.scada_lts.web.mvc.api.json.WorkItemInfoListTest" includeTestsMatching "org.scada_lts.monitor.ConcurrentMonitoredValuesTest" includeTestsMatching "com.serotonin.mango.rt.dataSource.DataPointUnreliableUtilsTest" + includeTestsMatching "com.serotonin.mango.rt.dataSource.InitializeDataSourceRtTestsSuite" } } \ No newline at end of file diff --git a/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java b/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java index 4efaea4018..5bae2f06ba 100644 --- a/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java @@ -27,6 +27,7 @@ import com.serotonin.mango.rt.dataSource.DataSourceUtils; import com.serotonin.mango.rt.dataSource.PollingDataSource; import com.serotonin.web.i18n.LocalizableMessage; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; public class ASCIISerialDataSource extends PollingDataSource { @@ -52,7 +53,7 @@ private boolean reconnect() { try { while (true) { Thread.sleep(5000); - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); SerialPort p = getPort(vo.getCommPortId()); if (p != null) { configurePort(getsPort()); @@ -215,7 +216,7 @@ protected void doPoll(long time) { @Override public void initialize() { try { - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); getPort(vo.getCommPortId()); configurePort(getsPort()); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java index 664a9b21e1..d74766a225 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java @@ -2,7 +2,6 @@ import java.net.ConnectException; import java.util.Calendar; -import java.util.Date; import java.util.List; import com.serotonin.mango.util.LoggingUtils; @@ -22,6 +21,9 @@ import com.serotonin.messaging.TimeoutException; import com.serotonin.web.i18n.LocalizableMessage; +import static com.serotonin.mango.rt.dataSource.DataSourceUtils.checkInitialized; + + public class Dnp3DataSource extends PollingDataSource { private final Log LOG = LogFactory.getLog(Dnp3DataSource.class); @@ -44,13 +46,12 @@ public Dnp3DataSource(Dnp3DataSourceVO vo) { protected void doPoll(long time) { try { + checkInitialized(dnp3Master, this); dnp3Master.doPoll(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); } catch (Throwable e) { LOG.warn(LoggingUtils.info(e, this), e); - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, - new LocalizableMessage("event.exception2", vo.getName(), e - .getMessage())); + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, getLocalExceptionMessage(e)); return; } @@ -88,9 +89,7 @@ public void terminate() { returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this), e); - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, - new LocalizableMessage("event.exception2", vo.getName(), e - .getMessage())); + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getLocalExceptionMessage(e)); } } @@ -104,6 +103,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, int index = pointLocator.getIndex(); try { + checkInitialized(dnp3Master, this); if (dataType == 0x10) { dnp3Master.controlCommand(valueTime.getValue().toString(), index, pointLocator.getControlCommand(), pointLocator @@ -115,13 +115,11 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this), e); - raiseEvent(POINT_WRITE_EXCEPTION_EVENT, new Date().getTime(), true, - new LocalizableMessage("event.exception2", vo.getName(), e - .getMessage()), dataPoint); + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getLocalExceptionMessage(e), dataPoint); } } - protected LocalizableMessage getLocalExceptionMessage(Exception e) { + protected LocalizableMessage getLocalExceptionMessage(Throwable e) { if (e instanceof Exception) { Throwable cause = e.getCause(); if (cause instanceof TimeoutException) diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java index 271ec35665..a493f8d92b 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java @@ -34,9 +34,7 @@ public void initialize() { returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this)); - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, - new LocalizableMessage("event.exception2", configuration - .getName(), e.getMessage())); + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, getLocalExceptionMessage(e)); return; } @@ -44,7 +42,7 @@ public void initialize() { } @Override - protected LocalizableMessage getLocalExceptionMessage(Exception e) { + protected LocalizableMessage getLocalExceptionMessage(Throwable e) { if (e instanceof Exception) { Throwable cause = e.getCause(); if (cause instanceof NoSuchPortException) diff --git a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java index 5c56b471bb..7d87efceab 100644 --- a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java @@ -20,6 +20,7 @@ import com.serotonin.mango.rt.dataImage.SetPointSource; import com.serotonin.mango.rt.dataSource.PollingDataSource; import com.serotonin.web.i18n.LocalizableMessage; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; public class DrStorageHt5bDataSource extends PollingDataSource { @@ -355,7 +356,7 @@ public void setsPort(SerialPort sPort) { @Override public void initialize() { try { - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); getPort(vo.getCommPortId()); configurePort(getsPort()); setValuesHt5b(new ArrayList<>()); diff --git a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java index f46c395c80..b3f84c3074 100644 --- a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java @@ -37,14 +37,11 @@ public OPCDataSource(OPCDataSourceVO vo) { this.vo = vo; setPollingPeriod(vo.getUpdatePeriodType(), vo.getUpdatePeriods(), vo.isQuantize()); - - this.opcMaster = new RealOPCMaster(); - JISystem.getLogger().setLevel(Level.OFF); } @Override protected void doPoll(long time) { - ArrayList enabledTags = new ArrayList(); + ArrayList enabledTags = new ArrayList<>(); for (DataPointRT dataPoint : dataPoints) { OPCPointLocatorVO dataPointVO = dataPoint.getVO().getPointLocator(); @@ -126,6 +123,15 @@ else if (dataPoint.getDataTypeId() == DataTypes.MULTISTATE) } public void initialize() { + if(opcMaster != null) { + try { + opcMaster.terminate(); + } catch (Exception e) { + LOG.warn(LoggingUtils.info(e, this)); + } + } + this.opcMaster = new RealOPCMaster(); + JISystem.getLogger().setLevel(Level.OFF); opcMaster.setHost(vo.getHost()); opcMaster.setDomain(vo.getDomain()); diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java index 7fca33b1f8..41fafeca42 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java @@ -26,6 +26,7 @@ import com.serotonin.mango.rt.dataImage.SetPointSource; import com.serotonin.mango.rt.dataSource.EventDataSource; import com.serotonin.web.i18n.LocalizableMessage; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; public class RadiuinoEventDataSource extends EventDataSource implements SerialPortEventListener { @@ -58,7 +59,7 @@ private boolean reconnect() { try { while (true) { Thread.sleep(5000); - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); SerialPort p = getPort(vo.getCommPortId(), vo.getTimeout()); if (p != null) { LOG.debug("Conexao estabelecida com a porta serial"); @@ -80,7 +81,7 @@ public void initialize() { LOG.debug("Inicializando o Radiuino Polling Data Source."); try { - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); getPort(vo.getCommPortId(), vo.getTimeout()); configurePort(getsPort()); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java index 90807c0e9d..ce7a8d2324 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java @@ -28,6 +28,7 @@ import com.serotonin.mango.rt.dataImage.SetPointSource; import com.serotonin.mango.rt.dataSource.PollingDataSource; import com.serotonin.web.i18n.LocalizableMessage; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; public class RadiuinoPollingDataSource extends PollingDataSource implements SerialPortEventListener { @@ -61,7 +62,7 @@ private boolean reconnect() { try { while (true) { Thread.sleep(5000); - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); SerialPort p = getPort(vo.getCommPortId(), vo.getTimeout()); if (p != null) { LOG.debug("Conexao estabelecida com a porta serial"); @@ -158,7 +159,7 @@ public void initialize() { LOG.debug("Inicializando o Radiuino Polling Data Source."); try { - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); getPort(vo.getCommPortId(), vo.getTimeout()); configurePort(getsPort()); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); diff --git a/src/com/serotonin/mango/Common.java b/src/com/serotonin/mango/Common.java index 183dc05616..6f37aadc0e 100644 --- a/src/com/serotonin/mango/Common.java +++ b/src/com/serotonin/mango/Common.java @@ -59,6 +59,7 @@ import com.serotonin.util.PropertiesUtils; import com.serotonin.util.StringUtils; import com.serotonin.web.i18n.LocalizableMessage; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; import org.scada_lts.serial.SerialPortUtils; import org.springframework.security.core.GrantedAuthority; @@ -408,7 +409,7 @@ public static List getCommPorts() throws CommPortConfigException { try { List ports = new LinkedList(); - Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); + Enumeration portEnum = ScadaCommPortIdentifier.getPortIdentifiers(); CommPortIdentifier cpid; while (portEnum.hasMoreElements()) { cpid = (CommPortIdentifier) portEnum.nextElement(); diff --git a/src/com/serotonin/mango/rt/RuntimeManager.java b/src/com/serotonin/mango/rt/RuntimeManager.java index 41598f8b52..12f5b481e9 100644 --- a/src/com/serotonin/mango/rt/RuntimeManager.java +++ b/src/com/serotonin/mango/rt/RuntimeManager.java @@ -491,13 +491,14 @@ private void startDataPoint(DataPointVO vo) { // Add/update it in the data source. ds.addDataPoint(dataPoint); - boolean reliable = isReliable(dataPoint, ds); - if(reliable) - resetUnreliableDataPoint(dataPoint); - else + boolean unreliable = dataPoint.isUnreliable(); + + if(unreliable) setUnreliableDataPoint(dataPoint); + else + resetUnreliableDataPoint(dataPoint); - LOG.info("Data point '" + vo.getExtendedName() + "' initialized - reliable: " + reliable); + LOG.info("Data point '" + vo.getExtendedName() + "' initialized - unreliable: " + unreliable); } } } diff --git a/src/com/serotonin/mango/rt/dataImage/DataPointRT.java b/src/com/serotonin/mango/rt/dataImage/DataPointRT.java index 61971a2f4b..0b06f0e13d 100644 --- a/src/com/serotonin/mango/rt/dataImage/DataPointRT.java +++ b/src/com/serotonin/mango/rt/dataImage/DataPointRT.java @@ -24,6 +24,8 @@ import com.serotonin.mango.rt.RuntimeManager; import com.serotonin.mango.rt.dataImage.types.MangoValue; import com.serotonin.mango.rt.dataImage.types.NumericValue; +import com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils; +import com.serotonin.mango.rt.dataSource.DataSourceRT; import com.serotonin.mango.rt.dataSource.PointLocatorRT; import com.serotonin.mango.rt.event.detectors.PointEventDetectorRT; import com.serotonin.mango.rt.maint.work.AbstractBeforeAfterWorkItem; @@ -631,4 +633,14 @@ public void terminateHistorical() { terminateIntervalLogging(); } + public boolean isUnreliable() { + DataSourceRT dataSourceRT = Common.ctx.getRuntimeManager().getRunningDataSource(getDataSourceId()); + if(dataSourceRT == null) + return true; + return !dataSourceRT.isInitialized() || isSetUnreliable(); + } + + public boolean isSetUnreliable() { + return DataPointUnreliableUtils.isSetUnreliable(this, true); + } } diff --git a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java index 7449fb067b..f2f85221d0 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java +++ b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java @@ -17,8 +17,9 @@ public final class DataPointUnreliableUtils { private DataPointUnreliableUtils() {} - public static boolean isReliable(DataPointRT dataPoint, DataSourceRT dataSource) { - return dataSource.isInitialized() && (!isSetUnreliable(dataPoint, true) || isSetUnreliable(dataPoint, false)); + public static boolean isSetUnreliable(DataPointRT dataPoint, boolean unreliable) { + return dataPoint.getAttribute(ATTR_UNRELIABLE_KEY) != null + && ((boolean) dataPoint.getAttribute(ATTR_UNRELIABLE_KEY)) == unreliable; } public static void setUnreliableDataPoints(List dataPoints) { @@ -63,8 +64,5 @@ private static List filter(List dataPoints, boolean un .collect(Collectors.toList()); } - private static boolean isSetUnreliable(DataPointRT dataPoint, boolean unreliable) { - return dataPoint.getAttribute(ATTR_UNRELIABLE_KEY) != null - && ((boolean) dataPoint.getAttribute(ATTR_UNRELIABLE_KEY)) == unreliable; - } + } \ No newline at end of file diff --git a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java index b4589ec4ba..3e95f81a1e 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java @@ -208,7 +208,7 @@ protected DataSourceEventType getEventType(int eventId) { return null; } - protected LocalizableMessage getSerialExceptionMessage(Exception e, String portId) { + protected LocalizableMessage getSerialExceptionMessage(Throwable e, String portId) { if (e instanceof NoSuchPortException) return new LocalizableMessage("event.serial.portOpenError", portId); if (e instanceof PortInUseException) @@ -216,7 +216,7 @@ protected LocalizableMessage getSerialExceptionMessage(Exception e, String portI return getExceptionMessage(e); } - protected static LocalizableMessage getExceptionMessage(Exception e) { + protected static LocalizableMessage getExceptionMessage(Throwable e) { return new LocalizableMessage("event.exception2", e.getClass().getName(), e.getMessage()); } diff --git a/src/com/serotonin/mango/rt/dataSource/DataSourceUtils.java b/src/com/serotonin/mango/rt/dataSource/DataSourceUtils.java index c9192cfc30..3a457be92e 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataSourceUtils.java +++ b/src/com/serotonin/mango/rt/dataSource/DataSourceUtils.java @@ -152,4 +152,10 @@ public static MangoValue getValue(String valueStr, int dataTypeId, return null; } + + public static void checkInitialized(T master, DataSourceRT dataSource) { + if(master == null || !dataSource.isInitialized()) { + throw new IllegalStateException("Data Source not initialized!"); + } + } } diff --git a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java index 4360f08ea7..db191de006 100644 --- a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java @@ -104,7 +104,7 @@ public class BACnetIPDataSourceRT extends PollingDataSource implements DeviceEve final Log log = LogFactory.getLog(BACnetIPDataSourceRT.class); final BACnetIPDataSourceVO vo; private LocalDevice localDevice; - private boolean initialized = false; + private volatile boolean initialized = false; final List pollsInProgress = new ArrayList(); private CovResubscriptionTask covResubscriptionTask; @@ -139,7 +139,7 @@ public void initialize() { // Deactivate any existing event. returnToNormal(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis()); } - catch (Exception e) { + catch (Throwable e) { raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); return; @@ -154,12 +154,13 @@ public void initialize() { } catch (BACnetException e) { fireMessageExceptionEvent("event.bacnet.iamError", e.getMessage()); + return; } // Find out who we're slummin with. try { localDevice.sendBroadcast(new WhoIsRequest()); - + returnToNormal(); // Wait for responses to come in. try { Thread.sleep(vo.getTimeout() / 4); @@ -170,9 +171,10 @@ public void initialize() { } catch (BACnetException e) { fireMessageExceptionEvent("event.bacnet.whoisError", e.getMessage()); + return; } - initialized = true; + initialized = isInitialized(localDevice); } @Override @@ -207,6 +209,7 @@ public void terminate() { } } LocalDevice.setExceptionListener(null); + initialized = isInitialized(localDevice); } @Override @@ -809,4 +812,8 @@ else if (value instanceof AlphanumericValue) { public boolean isInitialized() { return initialized; } + + private boolean isInitialized(LocalDevice localDevice) { + return localDevice != null && localDevice.isInitialized() && super.isInitialized(); + } } diff --git a/src/com/serotonin/mango/rt/dataSource/http/HttpReceiverDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/http/HttpReceiverDataSourceRT.java index 6fd1ef1bfa..6ccf382673 100644 --- a/src/com/serotonin/mango/rt/dataSource/http/HttpReceiverDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/http/HttpReceiverDataSourceRT.java @@ -18,6 +18,8 @@ */ package com.serotonin.mango.rt.dataSource.http; +import com.serotonin.mango.util.LoggingUtils; +import com.serotonin.web.i18n.LocalizableMessage; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -36,6 +38,8 @@ * @author Matthew Lohbihler */ public class HttpReceiverDataSourceRT extends EventDataSource implements HttpMulticastListener { + + public static final int INITIALIZATION_EXCEPTION_EVENT = 1; private final Log log = LogFactory.getLog(HttpReceiverDataSourceRT.class); private final HttpReceiverDataSourceVO vo; @@ -51,14 +55,26 @@ public HttpReceiverDataSourceRT(HttpReceiverDataSourceVO vo) { // @Override public void initialize() { - Common.ctx.getHttpReceiverMulticaster().addListener(this); + try { + Common.ctx.getHttpReceiverMulticaster().addListener(this); + returnToNormal(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(INITIALIZATION_EXCEPTION_EVENT, + System.currentTimeMillis(), true, new LocalizableMessage( + "event.initializationError", e.getMessage())); + return; + } super.initialize(); } @Override public void terminate() { super.terminate(); - Common.ctx.getHttpReceiverMulticaster().removeListener(this); + try { + Common.ctx.getHttpReceiverMulticaster().removeListener(this); + } catch (Throwable e) { + log.warn(LoggingUtils.info(e, this), e); + } } // diff --git a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java index b6d7ab015d..720138125b 100644 --- a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java @@ -52,6 +52,7 @@ import com.serotonin.web.i18n.LocalizableMessage; import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; +import static com.serotonin.mango.rt.dataSource.DataSourceUtils.checkInitialized; abstract public class ModbusDataSource extends PollingDataSource implements MessagingExceptionHandler { @@ -151,8 +152,14 @@ public void removeDataPoint(DataPointRT dataPoint) { @Override protected void doPoll(long time) { - - + try { + checkInitialized(modbusMaster, this); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, + getLocalExceptionMessage(e)); + return; + } if (!modbusMaster.isInitialized()) { if (vo.isCreateSlaveMonitorPoints()) { @@ -350,7 +357,7 @@ protected void initialize(ModbusMaster modbusMaster) { // Deactivate any existing event. returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getLocalExceptionMessage(e)); return; @@ -362,26 +369,6 @@ protected void initialize(ModbusMaster modbusMaster) { @Override public void forcePointRead(DataPointRT dataPoint) { - if (!modbusMaster.isInitialized()) { - // terminate(); - // - // vo.setEnabled(false); - // - // RuntimeManager runtimeManager = Common.ctx.getRuntimeManager(); - // - // for (DataPointRT dP : dataPoints) { - // dP.getVO().setEnabled(false); - // } - // - // for (DataPointRT dP : dataPoints) { - // dP.getVO().setEnabled(true); - // runtimeManager.saveDataPoint(dP.getVO()); - // } - // - // vo.setEnabled(true); - // runtimeManager.saveDataSource(vo); - } - ModbusPointLocatorRT pl = dataPoint.getPointLocator(); if (pl.getVO().isSlaveMonitor() || pl.getVO().isSocketMonitor()) // Nothing to do @@ -392,6 +379,7 @@ public void forcePointRead(DataPointRT dataPoint) { synchronized (pointListChangeLock) { try { + checkInitialized(modbusMaster, this); Object value = modbusMaster.getValue(ml); updatePointValue(dataPoint, pl, value, time); returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); @@ -399,7 +387,7 @@ public void forcePointRead(DataPointRT dataPoint) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", dataPoint .getVO().getName(), e.getMessage()), dataPoint); - } catch (ModbusTransportException e) { + } catch (Throwable e) { // Don't raise a data source exception. Polling should do that. LOG.warn("Error during forcePointRead", e); setUnreliableDataPoint(dataPoint); @@ -429,7 +417,8 @@ else if (pl.getVO().getDataTypeId() == DataTypes.ALPHANUMERIC) @Override public void terminate() { super.terminate(); - modbusMaster.destroy(); + if(modbusMaster != null) + modbusMaster.destroy(); } // @@ -444,6 +433,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, BaseLocator ml = createModbusLocator(pl.getVO()); try { + checkInitialized(modbusMaster, this); // See if this is a numeric value that needs to be converted. if (dataPoint.getDataTypeId() == DataTypes.NUMERIC) { double convertedValue = valueTime.getDoubleValue(); @@ -482,6 +472,10 @@ true, new LocalizableMessage("event.exception2", .getVO().getName(), e.getErrorResponse() .getExceptionMessage()), dataPoint); LOG.info("Error setting point value", e); + } catch (Throwable e) { + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime(), + true, new LocalizableMessage("event.exception2", + dataPoint.getVO().getName(), e.getMessage()), dataPoint); } } @@ -491,7 +485,7 @@ public static BaseLocator createModbusLocator(ModbusPointLocatorVO vo) { vo.getRegisterCount(), Charset.forName(vo.getCharset())); } - public static LocalizableMessage localExceptionMessage(Exception e) { + public static LocalizableMessage localExceptionMessage(Throwable e) { if (e instanceof ModbusTransportException) { Throwable cause = e.getCause(); if (cause instanceof TimeoutException) @@ -504,7 +498,7 @@ public static LocalizableMessage localExceptionMessage(Exception e) { return DataSourceRT.getExceptionMessage(e); } - protected LocalizableMessage getLocalExceptionMessage(Exception e) { + protected LocalizableMessage getLocalExceptionMessage(Throwable e) { return localExceptionMessage(e); } diff --git a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusSerialDataSource.java b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusSerialDataSource.java index c50b129b79..c0630c9b77 100644 --- a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusSerialDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusSerialDataSource.java @@ -112,7 +112,7 @@ public boolean verifyPort(String port) { } @Override - protected LocalizableMessage getLocalExceptionMessage(Exception e) { + protected LocalizableMessage getLocalExceptionMessage(Throwable e) { if (e instanceof ModbusInitException) { Throwable cause = e.getCause(); if (cause instanceof NoSuchPortException) diff --git a/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java index f8d1a0b7f1..1a958bd4c1 100644 --- a/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java @@ -86,7 +86,7 @@ synchronized private boolean initNmea() { // Deactivate any existing event. returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } - catch (Exception e) { + catch (Throwable e) { LocalizableMessage message = getSerialExceptionMessage(e, vo.getCommPortId()); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, message); log.debug("Error while initializing data source", e); @@ -97,7 +97,8 @@ synchronized private boolean initNmea() { } synchronized private void termNmea() { - nmeaReceiver.terminate(); + if(nmeaReceiver != null) + nmeaReceiver.terminate(); } // @@ -126,7 +127,7 @@ public void receivedMessage(NmeaMessage message) { if (parseError == null) parseError = e.getLocalizableMessage(); } - catch (Exception e) { + catch (Throwable e) { if (parseError == null) parseError = new LocalizableMessage("event.exception2", dp.getVO().getName(), e.getMessage()); } diff --git a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java index 87d46ca00c..0f4e8f16e3 100644 --- a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java @@ -65,23 +65,35 @@ public class PachubeDataSourceRT extends PollingDataSource { public static final int DATA_RETRIEVAL_FAILURE_EVENT = 1; public static final int PARSE_EXCEPTION_EVENT = 2; public static final int POINT_WRITE_EXCEPTION_EVENT = 3; + public static final int INITIALIZATION_EXCEPTION_EVENT = 4; public static final String HEADER_API_KEY = "X-PachubeApiKey"; final Log log = LogFactory.getLog(PachubeDataSourceRT.class); final PachubeDataSourceVO vo; - private final HttpClient httpClient; - final SimpleDateFormat sdf; + private HttpClient httpClient; + private SimpleDateFormat sdf; public PachubeDataSourceRT(PachubeDataSourceVO vo) { super(vo); setPollingPeriod(vo.getUpdatePeriodType(), vo.getUpdatePeriods(), false); this.vo = vo; + } - httpClient = createHttpClient(vo.getTimeoutSeconds(), vo.getRetries()); - - sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); - sdf.setTimeZone(TimeZone.getTimeZone("UTC")); + @Override + public void initialize() { + try { + httpClient = createHttpClient(vo.getTimeoutSeconds(), vo.getRetries()); + sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + sdf.setTimeZone(TimeZone.getTimeZone("UTC")); + returnToNormal(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + return; + } + super.initialize(); } public static HttpClient createHttpClient(int timeoutSeconds, int retries) { @@ -139,19 +151,19 @@ protected void pollFeed(int feedId, List points, long time) { try { data = getData(httpClient, feedId, vo.getApiKey()); } - catch (Exception e) { + catch (Throwable e) { LocalizableMessage lm; if (e instanceof LocalizableException) lm = ((LocalizableException) e).getLocalizableMessage(); else lm = new LocalizableMessage("event.pachube.feed.retrievalError", feedId, e.getMessage()); - raiseEvent(DATA_RETRIEVAL_FAILURE_EVENT, time, true, lm, points); + raiseEvent(DATA_RETRIEVAL_FAILURE_EVENT, time, true, lm); return; } // If we made it this far, everything is good. - returnToNormal(DATA_RETRIEVAL_FAILURE_EVENT, time, points); + returnToNormal(DATA_RETRIEVAL_FAILURE_EVENT, time); // We have the data. Now run the regex. LocalizableMessage parseErrorMessage = null; @@ -182,26 +194,27 @@ protected void pollFeed(int feedId, List points, long time) { // Save the new value if it is new if (!ObjectUtils.isEqual(dp.getPointValue(), pvt)) dp.updatePointValue(new PointValueTime(value, valueTime)); - resetUnreliableDataPoint(dp); } catch (LocalizableException e) { if (parseErrorMessage == null) parseErrorMessage = e.getLocalizableMessage(); - setUnreliableDataPoint(dp); } catch (ParseException e) { if (parseErrorMessage == null) parseErrorMessage = new LocalizableMessage("event.valueParse.timeParsePoint", dataValue.getTimestamp(), dp.getVO().getName()); - setUnreliableDataPoint(dp); + } + catch (Throwable e) { + if (parseErrorMessage == null) + parseErrorMessage = new LocalizableMessage("common.default", e.getMessage()); } } } if (parseErrorMessage != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseErrorMessage, points); + raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseErrorMessage); else - returnToNormal(PARSE_EXCEPTION_EVENT, time, points); + returnToNormal(PARSE_EXCEPTION_EVENT, time); } public static Map getData(HttpClient client, int feedId, String apiKey) diff --git a/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java index f9d0a60c0e..8aec6349fd 100644 --- a/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java @@ -104,7 +104,7 @@ public void initialize() { returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } - catch (IOException e) { + catch (Throwable e) { serverSocket = null; raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); diff --git a/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java index c6bd7706c3..2598033a8c 100644 --- a/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java @@ -108,7 +108,7 @@ private void finishTime(){ private final Log log = LogFactory.getLog(SnmpDataSourceRT.class); private final SnmpDataSourceVO vo; - private final Version version; + private Version version; private String address; private Target target; private Snmp snmp; @@ -124,12 +124,6 @@ public SnmpDataSourceRT(SnmpDataSourceVO vo) { super(vo); setPollingPeriod(vo.getUpdatePeriodType(), vo.getUpdatePeriods(), false); this.vo = vo; - version = Version.getVersion(vo.getSnmpVersion(), vo.getCommunity(), - vo.getSecurityName(), vo.getAuthProtocol(), - vo.getAuthPassphrase(), vo.getPrivProtocol(), - vo.getPrivPassphrase(), vo.getSecurityLevel(), - vo.getContextName()); - snmpRequests = new SnmpResponses(); } @Override @@ -383,6 +377,12 @@ private void updatePoint(DataPointRT dp, Variable variable, long time) { @Override public void initialize() { try { + version = Version.getVersion(vo.getSnmpVersion(), vo.getCommunity(), + vo.getSecurityName(), vo.getAuthProtocol(), + vo.getAuthPassphrase(), vo.getPrivProtocol(), + vo.getPrivPassphrase(), vo.getSecurityLevel(), + vo.getContextName()); + snmpRequests = new SnmpResponses(); initializeComponents(); counterEmptyResponsesOrResponsesWithError=0; log.info("Counter Empty Responses Or Responses With Error is set 0."); @@ -392,7 +392,7 @@ public void initialize() { // Deactivate any existing event. returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, DataSourceRT.getExceptionMessage(e)); log.debug("Error while initializing data source", e); diff --git a/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java index 53637ee9bc..00871415e4 100644 --- a/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java @@ -110,7 +110,7 @@ public ViconicsDataSourceRT(ViconicsDataSourceVO vo) { public void initialize() { try { network = new ViconicsNetwork(vo.getCommPortId(), Common.timer); - } catch (ViconicsConfigurationException e) { + } catch (Throwable e) { raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); @@ -129,7 +129,7 @@ public void initialize() { try { network.init(); network.startNetwork(vo.getPanId(), vo.getChannel()); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); @@ -494,7 +494,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime pvt, locator.getPointAddress(), value); dataPoint.setPointValue(pvt, source); returnToNormal(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent( MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), @@ -513,7 +513,7 @@ public void forcePointRead(DataPointRT dataPoint) { network.readValue(locator.getDeviceIeee(), locator.getPointAddress()); returnToNormal(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent( MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), diff --git a/src/com/serotonin/mango/util/LoggingUtils.java b/src/com/serotonin/mango/util/LoggingUtils.java index 44c0edebae..d19e832bb6 100644 --- a/src/com/serotonin/mango/util/LoggingUtils.java +++ b/src/com/serotonin/mango/util/LoggingUtils.java @@ -135,12 +135,12 @@ public static String dataSourcePointValueTimeInfo(DataSourceVO dataSource, Da return LoggingUtils.dataSourceInfo(dataSource) + ", " + LoggingUtils.dataPointInfo(dataPoint) + ", " + LoggingUtils.pointValueTimeInfo(valueTime, source); } - public static String causeInfo(Exception e) { + public static String causeInfo(Throwable e) { return exceptionInfo(getCause(e)); } - public static Exception getCause(Exception e) { - return e.getCause() != null ? (Exception) e.getCause() : e; + public static Throwable getCause(Throwable e) { + return e.getCause() != null ? e.getCause() : e; } public static String userInfo(User user) { diff --git a/src/com/serotonin/mango/vo/dataSource/http/HttpReceiverDataSourceVO.java b/src/com/serotonin/mango/vo/dataSource/http/HttpReceiverDataSourceVO.java index 985db8511b..bfa47fd9bb 100644 --- a/src/com/serotonin/mango/vo/dataSource/http/HttpReceiverDataSourceVO.java +++ b/src/com/serotonin/mango/vo/dataSource/http/HttpReceiverDataSourceVO.java @@ -47,12 +47,18 @@ public class HttpReceiverDataSourceVO extends DataSourceVO ets) { - // no op + ets.add(createEventType(HttpReceiverDataSourceRT.INITIALIZATION_EXCEPTION_EVENT, new LocalizableMessage( + "event.ds.initialization"))); } @Override public ExportCodes getEventCodes() { - return null; + return EVENT_CODES; + } + + private static final ExportCodes EVENT_CODES = new ExportCodes(); + static { + EVENT_CODES.addElement(HttpReceiverDataSourceRT.INITIALIZATION_EXCEPTION_EVENT, "INITIALIZATION_EXCEPTION"); } @Override diff --git a/src/com/serotonin/mango/vo/dataSource/pachube/PachubeDataSourceVO.java b/src/com/serotonin/mango/vo/dataSource/pachube/PachubeDataSourceVO.java index 3761b1f421..c8a7eb34ef 100644 --- a/src/com/serotonin/mango/vo/dataSource/pachube/PachubeDataSourceVO.java +++ b/src/com/serotonin/mango/vo/dataSource/pachube/PachubeDataSourceVO.java @@ -54,6 +54,9 @@ protected void addEventTypes(List ets) { "event.ds.dataParse"))); ets.add(createEventType(PachubeDataSourceRT.POINT_WRITE_EXCEPTION_EVENT, new LocalizableMessage( "event.ds.pointWrite"))); + ets.add(createEventType(PachubeDataSourceRT.INITIALIZATION_EXCEPTION_EVENT, new LocalizableMessage( + "event.ds.initialization" + ))); } private static final ExportCodes EVENT_CODES = new ExportCodes(); @@ -61,6 +64,7 @@ protected void addEventTypes(List ets) { EVENT_CODES.addElement(PachubeDataSourceRT.DATA_RETRIEVAL_FAILURE_EVENT, "DATA_RETRIEVAL_FAILURE"); EVENT_CODES.addElement(PachubeDataSourceRT.PARSE_EXCEPTION_EVENT, "PARSE_EXCEPTION"); EVENT_CODES.addElement(PachubeDataSourceRT.POINT_WRITE_EXCEPTION_EVENT, "POINT_WRITE_EXCEPTION"); + EVENT_CODES.addElement(PachubeDataSourceRT.INITIALIZATION_EXCEPTION_EVENT, "INITIALIZATION_EXCEPTION"); } @Override diff --git a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java index 70e5477867..cc107699d8 100644 --- a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java +++ b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java @@ -22,8 +22,6 @@ public class MessagingDataSourceRT extends PollingDataSource { - private static final String ATTR_UPDATE_ERROR_KEY = "DP_UPDATE_ERROR"; - public static final int DATA_SOURCE_EXCEPTION_EVENT = 1; public static final int DATA_POINT_PUBLISH_EXCEPTION_EVENT = 2; public static final int DATA_POINT_INIT_EXCEPTION_EVENT = 3; @@ -59,7 +57,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPo try { messagingService.publish(dataPoint, message); returnToNormal(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { + } catch (Throwable e) { LOG.error(dataSourcePointValueTimeInfo(vo, dataPointVO, valueTime, source) + ", " + exceptionInfo(e), e); raiseEvent(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis(), true, @@ -72,8 +70,8 @@ public void initialize() { try { messagingService.open(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { - LOG.error(exceptionInfo(e), e); + } catch (Throwable e) { + LOG.error(info(e, this), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e)); return; @@ -88,8 +86,8 @@ public void terminate() { try { messagingService.close(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { - LOG.error(exceptionInfo(e), e); + } catch (Throwable e) { + LOG.error(info(e, this), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e)); } finally { @@ -103,8 +101,8 @@ public void addDataPoint(DataPointRT dataPoint) { updateAttemptsCounters.putIfAbsent(dataPoint.getId(), new AtomicInteger()); messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), getPointUpdateReturnToNormalHandler()); returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { - LOG.error(exceptionInfo(e), e); + } catch (Throwable e) { + LOG.error(info(e, this), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e), dataPoint); } @@ -116,8 +114,8 @@ public void removeDataPoint(DataPointRT dataPoint) { try { messagingService.removeReceiver(dataPoint); returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { - LOG.error(exceptionInfo(e), e); + } catch (Throwable e) { + LOG.error(info(e, this), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e), dataPoint); } finally { @@ -130,22 +128,26 @@ public void removeDataPoint(DataPointRT dataPoint) { protected void doPoll(long time) { for (DataPointRT dataPoint : dataPoints) { try { - updateAttemptsCounters.putIfAbsent(dataPoint.getId(), new AtomicInteger()); - if(updateAttemptsCounters.get(dataPoint.getId()).get() < updateAttempts) { - messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), getPointUpdateReturnToNormalHandler()); - updateAttemptsCounters.get(dataPoint.getId()).set(0); + if(!messagingService.isOpen(dataPoint)) { + updateAttemptsCounters.putIfAbsent(dataPoint.getId(), new AtomicInteger()); + if (updateAttemptsCounters.get(dataPoint.getId()).get() < updateAttempts) { + messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), getPointUpdateReturnToNormalHandler()); + updateAttemptsCounters.get(dataPoint.getId()).set(0); + returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); + } + } else { returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } - } catch (Exception e) { + } catch (Throwable e) { updateAttemptsCounters.get(dataPoint.getId()).incrementAndGet(); - LOG.warn(exceptionInfo(e), e); + LOG.error(info(e, this), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e), dataPoint); } } } - private java.util.function.Consumer getPointUpdateExceptionHandler(DataPointRT dataPoint) { + private java.util.function.Consumer getPointUpdateExceptionHandler(DataPointRT dataPoint) { return ex -> { LOG.warn("Error Update: " + dataPointInfo(dataPoint.getVO()) + ", " + dataSourceInfo(vo) + ", " + exceptionInfo(ex), ex); diff --git a/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java b/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java index d9bef828c9..94ff8d43de 100644 --- a/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java +++ b/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java @@ -7,5 +7,5 @@ import java.util.function.Supplier; public interface InitMessagingChannels extends MessagingChannels { - void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException; + void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException; } diff --git a/src/org/scada_lts/ds/messaging/channel/MessagingChannelsImpl.java b/src/org/scada_lts/ds/messaging/channel/MessagingChannelsImpl.java index 84fb607793..2577e22d51 100644 --- a/src/org/scada_lts/ds/messaging/channel/MessagingChannelsImpl.java +++ b/src/org/scada_lts/ds/messaging/channel/MessagingChannelsImpl.java @@ -26,7 +26,7 @@ public void removeChannel(DataPointRT dataPoint) throws MessagingChannelExceptio channel.close(timeout); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Remove Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -46,7 +46,7 @@ public void initChannel(DataPointRT dataPoint, Supplier create getChannel(dataPoint).orElseGet(() -> operationChannels.createChannelIfNotExists(dataPoint.getId(), a -> create.get())); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Init Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -58,7 +58,7 @@ public void publish(DataPointRT dataPoint, String message) { channel.publish(message); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Publish: " + dataPointInfo(dataPoint.getVO()) + ", Value: " + message + ", " + exceptionInfo(e), e); } }); diff --git a/src/org/scada_lts/ds/messaging/channel/NonSyncOperationChannels.java b/src/org/scada_lts/ds/messaging/channel/NonSyncOperationChannels.java index 347018a3a9..82c912ee71 100644 --- a/src/org/scada_lts/ds/messaging/channel/NonSyncOperationChannels.java +++ b/src/org/scada_lts/ds/messaging/channel/NonSyncOperationChannels.java @@ -23,7 +23,7 @@ public void closeChannels(int timeout) throws MessagingChannelException { for(MessagingChannel channel: chs.values()) { try { channel.close(timeout); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Init Channel: " + channel.getClass().getName() + ", " + exceptionInfo(ex), ex); } } diff --git a/src/org/scada_lts/ds/messaging/channel/SyncOperationChannels.java b/src/org/scada_lts/ds/messaging/channel/SyncOperationChannels.java index 08e823af3f..438208248c 100644 --- a/src/org/scada_lts/ds/messaging/channel/SyncOperationChannels.java +++ b/src/org/scada_lts/ds/messaging/channel/SyncOperationChannels.java @@ -1,7 +1,9 @@ package org.scada_lts.ds.messaging.channel; -import net.bull.javamelody.internal.common.LOG; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.scada_lts.ds.messaging.exception.MessagingChannelException; +import org.scada_lts.ds.messaging.protocol.amqp.client.AmqpMessagingChannels; import java.util.HashMap; import java.util.Map; @@ -12,6 +14,8 @@ class SyncOperationChannels implements OperationChannels { + private static final Log LOG = LogFactory.getLog(AmqpMessagingChannels.class); + private final Map channels; private final ReentrantReadWriteLock lock; @@ -28,7 +32,7 @@ public void closeChannels(int timeout) throws MessagingChannelException { for(MessagingChannel channel: chs.values()) { try { channel.close(timeout); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Init Channel: " + channel.getClass().getName() + ", " + exceptionInfo(ex), ex); } } diff --git a/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java b/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java index 46362d5d62..ea50e9c3b1 100644 --- a/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java +++ b/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java @@ -10,10 +10,10 @@ public class UpdatePointValueConsumer implements Consumer { private final DataPointRT dataPoint; private final Writable writable; - private final Consumer exceptionHandler; + private final Consumer exceptionHandler; private final Supplier returnToNormal; - public UpdatePointValueConsumer(DataPointRT dataPoint, Writable writable, Consumer exceptionHandler, Supplier returnToNormal) { + public UpdatePointValueConsumer(DataPointRT dataPoint, Writable writable, Consumer exceptionHandler, Supplier returnToNormal) { this.dataPoint = dataPoint; this.writable = writable; this.exceptionHandler = exceptionHandler; @@ -27,7 +27,7 @@ public void accept(byte[] payload) { String message = new String(payload, StandardCharsets.UTF_8); dataPoint.updatePointValue(message); returnToNormal.get(); - } catch (Exception ex) { + } catch (Throwable ex) { exceptionHandler.accept(ex); } } diff --git a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java index 213b65c025..f6d6762461 100644 --- a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java +++ b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java @@ -14,7 +14,7 @@ final class AmqpChannelFactory { private AmqpChannelFactory() {} - static AmqpChannel createReceiver(DataPointRT dataPoint, AmqpConnection connection, Consumer exceptionHandler, Supplier returnToNormal) throws IOException { + static AmqpChannel createReceiver(DataPointRT dataPoint, AmqpConnection connection, Consumer exceptionHandler, Supplier returnToNormal) throws IOException { AmqpChannel receive = configChannel(dataPoint, connection); if(receive == null) return null; @@ -59,7 +59,7 @@ private static void basicQos(AmqpChannel channel, AmqpPointLocatorVO vo) throws channel.basicQos(vo.getQos()); } - private static void basicConsume(DataPointRT dataPoint, AmqpChannel channel, Consumer exceptionHandler, Supplier returnToNormal) throws IOException { + private static void basicConsume(DataPointRT dataPoint, AmqpChannel channel, Consumer exceptionHandler, Supplier returnToNormal) throws IOException { AmqpPointLocatorRT locator = dataPoint.getPointLocator(); AmqpPointLocatorVO vo = locator.getVO(); boolean noAck = vo.getMessageAck() == MessageAckType.NO_ACK; diff --git a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannel.java b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannel.java index b10b51c995..c5ef9311e1 100644 --- a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannel.java +++ b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannel.java @@ -32,7 +32,7 @@ public void close(int timeout) throws MessagingChannelException { channel.close(); } catch (IOException e) { throw new MessagingChannelException("Error Close Channel: " + dataPointInfo(dataPointRT.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Close Channel: " + dataPointInfo(dataPointRT.getVO()) + ", " + exceptionInfo(e), e); } } @@ -43,7 +43,7 @@ public void publish(String message) throws MessagingChannelException { basicPublish(dataPointRT, channel, message); } catch (IOException e) { throw new MessagingChannelException("Error Publish: " + dataPointInfo(dataPointRT.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Publish: " + dataPointInfo(dataPointRT.getVO()) + ", " + exceptionInfo(e), e); } } diff --git a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java index ffded69691..ccbb63a99e 100644 --- a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java +++ b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java @@ -37,11 +37,11 @@ public void openConnection() throws MessagingChannelException { } catch (IOException e) { try { connectionManager.close(); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Close Channel: " + exceptionInfo(e), e); } throw new MessagingChannelException("Error Open Channel: " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { try { connectionManager.close(); } catch (Exception ex) { @@ -57,7 +57,7 @@ public void removeChannel(DataPointRT dataPoint) throws MessagingChannelExceptio channels.removeChannel(dataPoint); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Remove Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } finally { if (channels.size() == 0) { @@ -76,13 +76,13 @@ public boolean isOpenChannel(DataPointRT dataPoint) { } @Override - public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { + public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { connectionManager.getIfOpen().or(() -> { try { return Optional.ofNullable(connectionManager.open(vo)); } catch (IOException e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }).ifPresent(conn -> { @@ -97,7 +97,7 @@ public void initChannel(DataPointRT dataPoint, Consumer exceptionHand }}); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Init Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }); @@ -110,7 +110,7 @@ public void initChannel(DataPointRT dataPoint, Supplier create return Optional.ofNullable(connectionManager.open(vo)); } catch (IOException e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }).ifPresent(conn -> { @@ -118,7 +118,7 @@ public void initChannel(DataPointRT dataPoint, Supplier create channels.initChannel(dataPoint, create); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Init Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }); @@ -131,7 +131,7 @@ public void publish(DataPointRT dataPoint, String message) throws MessagingChann return Optional.ofNullable(connectionManager.open(vo)); } catch (IOException e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }).ifPresent(conn -> { @@ -139,7 +139,7 @@ public void publish(DataPointRT dataPoint, String message) throws MessagingChann channels.publish(dataPoint, message); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Publish: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }); @@ -154,12 +154,12 @@ public boolean isOpenConnection() { public void closeChannels() throws MessagingChannelException { try { channels.closeChannels(); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Close Channels: " + exceptionInfo(ex), ex); } finally { try { connectionManager.close(); - } catch (IOException e) { + } catch (Throwable e) { LOG.warn("Error Close Connection: " + exceptionInfo(e), e); } } diff --git a/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannel.java b/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannel.java index 02a63ba2eb..365dc64e1c 100644 --- a/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannel.java +++ b/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannel.java @@ -36,12 +36,12 @@ public void close(int timeout) throws MessagingChannelException { client.disconnect(timeout); } catch (IOException e) { throw new MessagingChannelException("Error Disconnect Channel: " + dataPointInfo(dataPointRT.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Disconnect Channel: " + dataPointInfo(dataPointRT.getVO()) + ", " + exceptionInfo(e), e); } finally { try { client.close(); - } catch (Exception e) { + } catch (Throwable e) { LOG.warn("Error Close Channel: " + dataPointInfo(dataPointRT.getVO()) + ", " + exceptionInfo(e), e); } } @@ -54,7 +54,7 @@ public void publish(String message) throws MessagingChannelException { try { client.publish(locator.getTopicFilter(), message.getBytes(StandardCharsets.UTF_8), locator.getQos(), locator.isRetained()); - } catch (Exception ex) { + } catch (Throwable ex) { throw new RuntimeException("Error Publish: " + dataPointInfo(dataPointRT.getVO())+ ", Value: " + message + ", " + exceptionInfo(ex), ex); } } diff --git a/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java b/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java index 1060197892..3bd5825f7e 100644 --- a/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java +++ b/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java @@ -35,7 +35,7 @@ public void removeChannel(DataPointRT dataPoint) throws MessagingChannelExceptio channels.removeChannel(dataPoint); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Remove Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -46,18 +46,18 @@ public boolean isOpenChannel(DataPointRT dataPoint) { } @Override - public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { + public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { try { channels.initChannel(dataPoint, () -> { try { return new MqttMessagingChannel(createClient(dataPoint, exceptionHandler, returnToNormal), dataPoint); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Create Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + causeInfo(e), e.getCause()); } }); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Init Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -68,7 +68,7 @@ public void initChannel(DataPointRT dataPoint, Supplier create channels.initChannel(dataPoint, create); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Init Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -79,7 +79,7 @@ public void publish(DataPointRT dataPoint, String message) throws MessagingChann channels.publish(dataPoint, message); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Publish: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -93,8 +93,8 @@ public boolean isOpenConnection() { public void closeChannels() throws MessagingChannelException { try { channels.closeChannels(); - } catch (Exception ex) { - LOG.warn("Error Close Channels: " + exceptionInfo(ex), ex); + } catch (Throwable ex) { + LOG.warn("Error Close Channels: " + dataSourceInfo(vo) + ", " + exceptionInfo(ex), ex); } } @@ -103,7 +103,7 @@ public int size() { return channels.size(); } - private MqttVClient createClient(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { + private MqttVClient createClient(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { MqttPointLocatorRT pointLocator = dataPoint.getPointLocator(); MqttPointLocatorVO locator = pointLocator.getVO(); @@ -111,21 +111,21 @@ private MqttVClient createClient(DataPointRT dataPoint, Consumer exce try { MqttVersion mqttVersion = (MqttVersion) vo.getProtocolVersion(); client = mqttVersion.newClient(vo, locator); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Create Client: " + dataSourcePointInfo(vo, dataPoint.getVO()) + ", " + exceptionInfo(e), e); } try { client.connect(); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Connect Client: " + dataSourcePointInfo(vo, dataPoint.getVO()) + ", " + exceptionInfo(e), e); } try { client.subscribe(locator.getTopicFilter(), locator.getQos(), (topic, mqttMessage) -> new UpdatePointValueConsumer(dataPoint, locator::isWritable, exceptionHandler, returnToNormal).accept(mqttMessage.getPayload())); - } catch (Exception e) { + } catch (Throwable e) { try { close(client); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Close Client: " + dataSourcePointInfo(vo, dataPoint.getVO()) + ", " + exceptionInfo(ex), ex); } throw new MessagingChannelException("Error Subscribe Client: " + dataSourcePointInfo(vo, dataPoint.getVO()) + ", " + exceptionInfo(e), e); diff --git a/src/org/scada_lts/ds/messaging/service/MessagingService.java b/src/org/scada_lts/ds/messaging/service/MessagingService.java index 6bf68a70df..5ad44202e4 100644 --- a/src/org/scada_lts/ds/messaging/service/MessagingService.java +++ b/src/org/scada_lts/ds/messaging/service/MessagingService.java @@ -13,7 +13,7 @@ public interface MessagingService { void open() throws MessagingServiceException; void close() throws MessagingServiceException; - void initReceiver(DataPointRT dataPoint, Consumer updateExceptionHandler, Supplier returnToNormal) throws MessagingServiceException; + void initReceiver(DataPointRT dataPoint, Consumer updateExceptionHandler, Supplier returnToNormal) throws MessagingServiceException; void removeReceiver(DataPointRT dataPoint) throws MessagingServiceException; void publish(DataPointRT dataPoint, String message) throws MessagingServiceException; } diff --git a/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java b/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java index de6d0ceaf5..a1f3fbe0f1 100644 --- a/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java +++ b/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java @@ -31,19 +31,19 @@ class MessagingServiceImpl implements MessagingService { @Override public void publish(DataPointRT dataPoint, String message) throws MessagingServiceException { if(blocked) { - throw new MessagingServiceException("Stop Publish: " + dataSourceInfo(vo) + ", Service of shutting down: " + dataSourceInfo(vo) + ", Value: " + message); + throw new MessagingServiceException("Stop Publish: " + dataPointInfo(dataPoint) + ", Service of shutting down: " + dataSourceInfo(vo) + ", Value: " + message); } try { channels.publish(dataPoint, message); - } catch (Exception e) { - throw new MessagingServiceException("Error Publish: " + dataSourceInfo(vo) + ", Value: " + message + ", " + exceptionInfo(e), e); + } catch (Throwable e) { + throw new MessagingServiceException("Error Publish: " + dataPointInfo(dataPoint) + ", Value: " + message + ", " + exceptionInfo(e), e); } } @Override - public void initReceiver(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingServiceException { + public void initReceiver(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingServiceException { if(blocked) { - LOG.warn("Stop Init Receiver: " + dataSourceInfo(vo) + ", Service of shutting down: " + dataSourceInfo(vo)); + LOG.warn("Stop Init Receiver: " + dataPointInfo(dataPoint) + ", Service of shutting down: " + dataSourceInfo(vo)); return; } if(isOpen(dataPoint)) { @@ -51,7 +51,7 @@ public void initReceiver(DataPointRT dataPoint, Consumer exceptionHan } try { channels.initChannel(dataPoint, exceptionHandler, returnToNormal); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingServiceException("Error Init Receiver: " + dataSourceInfo(vo) + ", " + exceptionInfo(e), e); } } @@ -59,12 +59,12 @@ public void initReceiver(DataPointRT dataPoint, Consumer exceptionHan @Override public void removeReceiver(DataPointRT dataPoint) throws MessagingServiceException { if(blocked) { - LOG.warn("Stop Remove Receiver: " + dataSourceInfo(vo) + ", Service of shutting down: " + dataSourceInfo(vo)); + LOG.warn("Stop Remove Receiver: " + dataPointInfo(dataPoint) + ", Service of shutting down: " + dataSourceInfo(vo)); return; } try { channels.removeChannel(dataPoint); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingServiceException("Error Remove Receiver: " + dataSourceInfo(vo) + ", " + exceptionInfo(e), e); } } @@ -81,16 +81,14 @@ public boolean isOpen(DataPointRT dataPoint) { @Override public void open() throws MessagingServiceException { - if(blocked) { - throw new MessagingServiceException("Stop Open Connection: Service of shutting down: " + dataSourceInfo(vo)); - } if(channels.isOpenConnection()) { + blocked = false; LOG.warn("Stop Open Connection: Connection is opened: " + dataSourceInfo(vo)); return; } try { channels.openConnection(); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingServiceException("Error Open Connection: " + dataSourceInfo(vo) + ", " + exceptionInfo(e), e); } blocked = false; @@ -101,7 +99,7 @@ public void close() throws MessagingServiceException { blocked = true; try { channels.closeChannels(); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Close Receivers: " + dataSourceInfo(vo) + ", " + exceptionInfo(ex), ex); } } diff --git a/src/org/scada_lts/serial/gnu/io/ScadaCommPortIdentifier.java b/src/org/scada_lts/serial/gnu/io/ScadaCommPortIdentifier.java new file mode 100644 index 0000000000..3876e196ce --- /dev/null +++ b/src/org/scada_lts/serial/gnu/io/ScadaCommPortIdentifier.java @@ -0,0 +1,11 @@ +package org.scada_lts.serial.gnu.io; + + +import java.util.Enumeration; + +public class ScadaCommPortIdentifier { + + public static Enumeration getPortIdentifiers() { + return gnu.io.CommPortIdentifier.getPortIdentifiers(); + } +} diff --git a/test/br/org/scadabr/db/utils/TestUtils.java b/test/br/org/scadabr/db/utils/TestUtils.java index 35aaf64ebd..d9b8a846e6 100644 --- a/test/br/org/scadabr/db/utils/TestUtils.java +++ b/test/br/org/scadabr/db/utils/TestUtils.java @@ -1,18 +1,15 @@ package br.org.scadabr.db.utils; import java.util.ArrayList; -import java.util.Random; import com.serotonin.mango.db.dao.UserDao; import com.serotonin.mango.vo.DataPointVO; import com.serotonin.mango.vo.User; import com.serotonin.mango.vo.dataSource.DataSourceVO; import com.serotonin.mango.vo.dataSource.PointLocatorVO; -import com.serotonin.mango.vo.dataSource.viconics.ViconicsPointLocatorVO; import com.serotonin.mango.vo.dataSource.virtual.VirtualDataSourceVO; import com.serotonin.mango.vo.dataSource.virtual.VirtualPointLocatorVO; import com.serotonin.mango.vo.permission.DataPointAccess; -import org.scada_lts.dao.model.pointhierarchy.PointHierarchyNode; public class TestUtils { @@ -27,8 +24,8 @@ public static User createUser() { user.setHomeUrl("url"); user.setReceiveAlarmEmails(1); user.setReceiveOwnAuditEvents(true); - user.setDataSourcePermissions(new ArrayList()); - user.setDataPointPermissions(new ArrayList()); + user.setDataSourcePermissions(new ArrayList<>()); + user.setDataPointPermissions(new ArrayList<>()); new UserDao().saveUser(user); return user; @@ -46,8 +43,8 @@ public static User newUser(int id) { user.setHomeUrl("url"); user.setReceiveAlarmEmails(1); user.setReceiveOwnAuditEvents(true); - user.setDataSourcePermissions(new ArrayList()); - user.setDataPointPermissions(new ArrayList()); + user.setDataSourcePermissions(new ArrayList<>()); + user.setDataPointPermissions(new ArrayList<>()); return user; } @@ -64,6 +61,7 @@ public static DataPointVO newPointSettable(int id, int folderId) { VirtualPointLocatorVO pointLocatorVO = new VirtualPointLocatorVO(); pointLocatorVO.setSettable(true); dataPoint1.setPointLocator(pointLocatorVO); + dataPoint1.setEventDetectors(new ArrayList<>()); return dataPoint1; } @@ -80,6 +78,23 @@ public static DataPointVO newPointSettable(int id, DataSourceVO dataSource, i VirtualPointLocatorVO pointLocatorVO = new VirtualPointLocatorVO(); pointLocatorVO.setSettable(true); dataPoint1.setPointLocator(pointLocatorVO); + dataPoint1.setEventDetectors(new ArrayList<>()); + return dataPoint1; + } + + public static DataPointVO newPointSettable(int id, DataSourceVO dataSource, + int folderId, PointLocatorVO metaPointLocatorVO) { + DataPointVO dataPoint1 = new DataPointVO(DataPointVO.LoggingTypes.ON_CHANGE); + dataPoint1.setId(id); + dataPoint1.setXid("DP_" + id); + dataPoint1.setName("dp_" + id); + dataPoint1.setDataSourceId(dataSource.getId()); + dataPoint1.setDataSourceName(dataSource.getName()); + dataPoint1.setDataSourceTypeId(dataSource.getType().getId()); + dataPoint1.setDataSourceXid(dataSource.getXid()); + dataPoint1.setPointFolderId(folderId); + dataPoint1.setPointLocator(metaPointLocatorVO); + dataPoint1.setEventDetectors(new ArrayList<>()); return dataPoint1; } @@ -96,6 +111,7 @@ public static DataPointVO newPointNonSettable(int id, DataSourceVO dataSource VirtualPointLocatorVO pointLocatorVO = new VirtualPointLocatorVO(); pointLocatorVO.setSettable(false); dataPoint1.setPointLocator(pointLocatorVO); + dataPoint1.setEventDetectors(new ArrayList<>()); return dataPoint1; } diff --git a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java index 58540123e8..e1f052c28e 100644 --- a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java +++ b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java @@ -3,16 +3,20 @@ import br.org.scadabr.db.utils.TestUtils; import com.serotonin.db.IntValuePair; import com.serotonin.mango.Common; +import com.serotonin.mango.db.dao.DataPointDao; +import com.serotonin.mango.db.dao.PointValueDao; +import com.serotonin.mango.rt.EventManager; import com.serotonin.mango.rt.RuntimeManager; import com.serotonin.mango.rt.dataImage.DataPointRT; import com.serotonin.mango.rt.dataImage.PointValueCache; -import com.serotonin.mango.rt.dataImage.types.MangoValue; -import com.serotonin.mango.rt.dataSource.meta.MetaPointLocatorRT; -import com.serotonin.mango.vo.User; -import com.serotonin.mango.rt.dataSource.virtual.VirtualPointLocatorRT; +import com.serotonin.mango.rt.maint.BackgroundProcessing; +import com.serotonin.mango.vo.DataPointVO; +import com.serotonin.mango.vo.TimePeriodType; +import com.serotonin.mango.vo.dataSource.meta.MetaDataSourceVO; import com.serotonin.mango.vo.dataSource.meta.MetaPointLocatorVO; -import com.serotonin.mango.vo.dataSource.virtual.ChangeTypeVO; -import com.serotonin.mango.vo.dataSource.virtual.NoChangeVO; +import com.serotonin.mango.vo.dataSource.virtual.VirtualDataSourceVO; +import com.serotonin.mango.vo.dataSource.virtual.VirtualPointLocatorVO; +import com.serotonin.mango.web.ContextWrapper; import com.serotonin.mango.web.dwr.MiscDwr; import com.serotonin.web.content.ContentGenerator; import org.directwebremoting.WebContextFactory; @@ -24,194 +28,539 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.scada_lts.dao.SystemSettingsDAO; -import utils.mock.MockUtils; +import org.scada_lts.mango.service.DataPointService; +import org.scada_lts.mango.service.DataSourceService; +import org.scada_lts.mango.service.PointValueService; +import org.scada_lts.mango.service.SystemSettingsService; +import org.scada_lts.web.beans.ApplicationBeans; +import org.scada_lts.web.ws.services.DataPointServiceWebSocket; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; -import static org.mockito.ArgumentMatchers.*; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoints; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.reset; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.set; +import static org.mockito.ArgumentMatchers.anyString; import static org.powermock.api.mockito.PowerMockito.*; @RunWith(PowerMockRunner.class) @PrepareForTest({WebContextFactory.class, Common.class, MiscDwr.class, SystemSettingsDAO.class, - ContentGenerator.class, PointValueCache.class, DataPointRT.class}) + ContentGenerator.class, PointValueCache.class, DataPointRT.class, RuntimeManager.class, DataPointDao.class, + PointValueDao.class, ApplicationBeans.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class DataPointUnreliableUtilsTest { - private List metaDataPoints; + private RuntimeManager runtimeManager; + + private DataPointVO metaDataPoint1; + private DataPointVO metaDataPoint2; + + private DataPointVO metaDataPoint6WithVirtualDataPoint1; + private DataPointVO metaDataPoint7WithVirtualDataPoint1; + private DataPointVO metaDataPoint8; + private DataPointVO metaDataPoint9WithVirtualDataPoint2; + private DataPointVO metaDataPoint10WithVirtualDataPoint1; + + private DataPointVO virtualDataPoint1; + private DataPointVO virtualDataPoint2; + + private MetaDataSourceVO metaDataSourceVO1; + private MetaDataSourceVO metaDataSourceVO2; + private VirtualDataSourceVO virtualDataSourceVO; + + private final List metaDataPoints = new ArrayList<>(); + private final List metaDataPointsWithContext = new ArrayList<>(); + private final List virtualDataPoints = new ArrayList<>(); @Before - public void config() throws Exception { - RuntimeManager runtimeManager = mock(RuntimeManager.class); - metaDataPoints = new ArrayList<>(); - when(runtimeManager.getRunningMetaDataPoints(anyInt())).thenReturn(metaDataPoints); - MockUtils.configMock(runtimeManager, new User()); - PointValueCache pointValueCache = mock(PointValueCache.class); - whenNew(PointValueCache.class) - .withArguments(anyInt(), anyInt()) - .thenReturn(pointValueCache); + public void configMock() throws Exception { + + DataSourceService dataSourceService = mock(DataSourceService.class); + whenNew(DataSourceService.class).withNoArguments().thenReturn(dataSourceService); + + DataPointService dataPointService = mock(DataPointService.class); + whenNew(DataPointService.class).withNoArguments().thenReturn(dataPointService); + + SystemSettingsService systemSettingsService = mock(SystemSettingsService.class); + whenNew(SystemSettingsService.class).withNoArguments().thenReturn(systemSettingsService); + + SystemSettingsDAO systemSettingsDAO = mock(SystemSettingsDAO.class); + whenNew(SystemSettingsDAO.class).withNoArguments().thenReturn(systemSettingsDAO); + + mockStatic(SystemSettingsDAO.class); + when(SystemSettingsDAO.getValue(anyString())).thenReturn(""); + when(SystemSettingsDAO.getFutureDateLimit()).thenReturn(1L); + + PointValueService mangoPointValues = mock(PointValueService.class); + whenNew(PointValueService.class).withNoArguments().thenReturn(mangoPointValues); + + mockStatic(ApplicationBeans.class); + DataPointServiceWebSocket dataPointServiceWebSocket = mock(DataPointServiceWebSocket.class); + when(ApplicationBeans.getDataPointServiceWebSocketBean()).thenReturn(dataPointServiceWebSocket); + + ContextWrapper contextWrapper = mock(ContextWrapper.class); + EventManager eventManager = mock(EventManager.class); + BackgroundProcessing backgroundProcessing = mock(BackgroundProcessing.class); - MetaPointLocatorVO metaPointLocatorVO = new MetaPointLocatorVO(); - metaPointLocatorVO.setContext(Arrays.asList(new IntValuePair(11, ""))); - MetaPointLocatorRT metaPointLocatorRT = new MetaPointLocatorRT(metaPointLocatorVO); + runtimeManager = new RuntimeManager(); + when(contextWrapper.getRuntimeManager()).thenReturn(runtimeManager); + when(contextWrapper.getEventManager()).thenReturn(eventManager); + when(contextWrapper.getBackgroundProcessing()).thenReturn(backgroundProcessing); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(111,-1), metaPointLocatorRT); - DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(112,-1), new MetaPointLocatorRT(new MetaPointLocatorVO())); - DataPointRT dataPointRT3 = new DataPointRT(TestUtils.newPointSettable(113,-1), new MetaPointLocatorRT(new MetaPointLocatorVO())); - metaDataPoints.addAll(Arrays.asList(dataPointRT1, dataPointRT2, dataPointRT3)); + Common.ctx = contextWrapper; + Common.timer.init(); + + configData(); } + private void configData() { + + metaDataSourceVO1 = new MetaDataSourceVO(); + metaDataSourceVO1.setId(123); + metaDataSourceVO1.setEnabled(true); + metaDataSourceVO1.setXid("TEST_DS_XID1"); + metaDataSourceVO1.setName("Meta_Test1"); + + metaDataSourceVO2 = new MetaDataSourceVO(); + metaDataSourceVO2.setId(345); + metaDataSourceVO2.setEnabled(true); + metaDataSourceVO2.setXid("TEST_DS_XID2"); + metaDataSourceVO2.setName("Meta_Test2"); + + virtualDataSourceVO = new VirtualDataSourceVO(); + virtualDataSourceVO.setEnabled(true); + virtualDataSourceVO.setId(567); + virtualDataSourceVO.setXid("TEST_DS_XID3"); + virtualDataSourceVO.setName("Virtual_Test"); + virtualDataSourceVO.setUpdatePeriods(1); + virtualDataSourceVO.setUpdatePeriodType(TimePeriodType.SECONDS.getCode()); + + + metaDataPoint1 = TestUtils.newPointSettable(111, metaDataSourceVO1, -1, new MetaPointLocatorVO()); + metaDataPoint1.setEnabled(true); + + metaDataPoint2 = TestUtils.newPointSettable(112, metaDataSourceVO1, -1, new MetaPointLocatorVO()); + metaDataPoint2.setEnabled(true); + + MetaPointLocatorVO metaPointLocatorVO1 = new MetaPointLocatorVO(); + metaPointLocatorVO1.setContext(Arrays.asList(new IntValuePair(117,""), new IntValuePair(121,""))); + metaDataPoint6WithVirtualDataPoint1 = TestUtils.newPointSettable(116, metaDataSourceVO2, -1, metaPointLocatorVO1); + metaDataPoint6WithVirtualDataPoint1.setEnabled(true); + + MetaPointLocatorVO metaPointLocatorVO2 = new MetaPointLocatorVO(); + metaPointLocatorVO2.setContext(Arrays.asList(new IntValuePair(118,""), new IntValuePair(121,""))); + metaDataPoint7WithVirtualDataPoint1 = TestUtils.newPointSettable(117, metaDataSourceVO2, -1, metaPointLocatorVO2); + metaDataPoint7WithVirtualDataPoint1.setEnabled(true); + + MetaPointLocatorVO metaPointLocatorVO3 = new MetaPointLocatorVO(); + metaPointLocatorVO3.setContext(Arrays.asList(new IntValuePair(119,""))); + metaDataPoint8 = TestUtils.newPointSettable(118, metaDataSourceVO2, -1, metaPointLocatorVO3); + metaDataPoint8.setEnabled(true); + + MetaPointLocatorVO metaPointLocatorVO4 = new MetaPointLocatorVO(); + metaPointLocatorVO4.setContext(Arrays.asList(new IntValuePair(120,""), new IntValuePair(122,""))); + metaDataPoint9WithVirtualDataPoint2 = TestUtils.newPointSettable(119, metaDataSourceVO2, -1, metaPointLocatorVO4); + metaDataPoint9WithVirtualDataPoint2.setEnabled(true); + + MetaPointLocatorVO metaPointLocatorVO5 = new MetaPointLocatorVO(); + metaPointLocatorVO5.setContext(Arrays.asList(new IntValuePair(118,""), new IntValuePair(121,""))); + metaDataPoint10WithVirtualDataPoint1 = TestUtils.newPointSettable(120, metaDataSourceVO2, -1, metaPointLocatorVO5); + metaDataPoint10WithVirtualDataPoint1.setEnabled(true); + + virtualDataPoint1 = TestUtils.newPointSettable(121, virtualDataSourceVO, -1, new VirtualPointLocatorVO()); + virtualDataPoint1.setEnabled(true); + + virtualDataPoint2 = TestUtils.newPointSettable(122, virtualDataSourceVO, -1, new VirtualPointLocatorVO()); + virtualDataPoint2.setEnabled(true); + + + runtimeManager.saveDataSource(metaDataSourceVO1); + runtimeManager.saveDataPoint(metaDataPoint1); + runtimeManager.saveDataPoint(metaDataPoint2); + + runtimeManager.saveDataSource(metaDataSourceVO2); + runtimeManager.saveDataPoint(metaDataPoint8); + runtimeManager.saveDataPoint(metaDataPoint6WithVirtualDataPoint1); + runtimeManager.saveDataPoint(metaDataPoint7WithVirtualDataPoint1); + runtimeManager.saveDataPoint(metaDataPoint9WithVirtualDataPoint2); + runtimeManager.saveDataPoint(metaDataPoint10WithVirtualDataPoint1); + + runtimeManager.saveDataSource(virtualDataSourceVO); + runtimeManager.saveDataPoint(virtualDataPoint1); + runtimeManager.saveDataPoint(virtualDataPoint2); + + + virtualDataPoints.add(runtimeManager.getDataPoint(virtualDataPoint1.getId())); + virtualDataPoints.add(runtimeManager.getDataPoint(virtualDataPoint2.getId())); + + metaDataPoints.add(runtimeManager.getDataPoint(metaDataPoint1.getId())); + metaDataPoints.add(runtimeManager.getDataPoint(metaDataPoint2.getId())); + + metaDataPointsWithContext.add(runtimeManager.getDataPoint(metaDataPoint6WithVirtualDataPoint1.getId())); + metaDataPointsWithContext.add(runtimeManager.getDataPoint(metaDataPoint7WithVirtualDataPoint1.getId())); + metaDataPointsWithContext.add(runtimeManager.getDataPoint(metaDataPoint8.getId())); + metaDataPointsWithContext.add(runtimeManager.getDataPoint(metaDataPoint9WithVirtualDataPoint2.getId())); + metaDataPointsWithContext.add(runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId())); + + } + + @Test + public void when_setUnreliableDataPoints_with_virtual_points_then_unreliable_true() { + + //given: + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + + //when: + setUnreliableDataPoints(virtualDataPoints); + + //then: + for(DataPointRT dataPoint: virtualDataPoints) { + Assert.assertEquals(true, dataPoint.isUnreliable()); + } + } + + @Test + public void when_setUnreliableDataPoints_with_meta_points_then_unreliable_true() { + + //given: + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + + //when: + setUnreliableDataPoints(metaDataPoints); + + //then: + for(DataPointRT dataPoint: metaDataPoints) { + Assert.assertEquals(true, dataPoint.isUnreliable()); + } + } + + @Test + public void when_setUnreliableDataPoints_with_meta_points_with_context_then_unreliable_true() { + + //given: + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + + //when: + setUnreliableDataPoints(metaDataPointsWithContext); + + //then: + for(DataPointRT dataPoint: metaDataPointsWithContext) { + Assert.assertEquals(true, dataPoint.isUnreliable()); + } + } + + @Test + public void when_getRunningDataSource_virtual_data_source_then_initialized_true() { + + //when: + DataSourceRT dataSourceRT = runtimeManager.getRunningDataSource(virtualDataSourceVO.getId()); + + //then: + Assert.assertEquals(true, dataSourceRT.isInitialized()); + + } + + @Test + public void when_getRunningDataSource_meta_data_source_then_initialized_true() { + + //when: + DataSourceRT dataSourceRT = runtimeManager.getRunningDataSource(metaDataSourceVO1.getId()); + + //then: + Assert.assertEquals(true, dataSourceRT.isInitialized()); + + } + + @Test + public void when_getRunningDataSource_meta_data_source_with_context_then_initialized_true() { + + //when: + DataSourceRT dataSourceRT = runtimeManager.getRunningDataSource(metaDataSourceVO2.getId()); + + //then: + Assert.assertEquals(true, dataSourceRT.isInitialized()); + + } + + @Test + public void when_setUnreliableDataPoint_with_virtual_point_then_unreliable_true() { + + //given: + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); + + //when: + setUnreliableDataPoint(dataPointRT); + + //then: + Assert.assertEquals(true, dataPointRT.isUnreliable()); + + } @Test - public void when_setUnreliableDataPoint_with_point_then_unreliable() { + public void when_setUnreliableDataPoint_with_meta_point_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); //when: - setUnreliableDataPoint(dataPointRT1); + setUnreliableDataPoint(dataPointRT); //then: - Assert.assertEquals(true, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + Assert.assertEquals(true, dataPointRT.isUnreliable()); + } @Test - public void when_setUnreliableDataPoints_with_points_then_unreliable() { + public void when_setUnreliableDataPoint_with_meta_point_with_context_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint6WithVirtualDataPoint1.getId()); //when: - setUnreliableDataPoints(dataPoints); + setUnreliableDataPoint(dataPointRT); //then: - Assert.assertEquals(true, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); - Assert.assertEquals(true, dataPointRT2.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + Assert.assertEquals(true, dataPointRT.isUnreliable()); + } @Test - public void when_resetUnreliableDataPoints_with_point_then_reliable() { + public void when_setUnreliableDataPoints_with_virtual_points_then_meta_points_unreliable_false() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: - resetUnreliableDataPoint(dataPointRT1); + setUnreliableDataPoints(virtualDataPoints); //then: - Assert.assertEquals(false, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + for(DataPointRT dataPoint: metaDataPoints) { + Assert.assertEquals(false, dataPoint.isUnreliable()); + } } @Test - public void when_resetUnreliableDataPoints_with_points_then_reliable() { + public void when_setUnreliableDataPoints_with_virtual_points_from_meta_points_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: - resetUnreliableDataPoints(dataPoints); + setUnreliableDataPoints(virtualDataPoints); //then: - Assert.assertEquals(false, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); - Assert.assertEquals(false, dataPointRT2.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + for(DataPointRT dataPoint: metaDataPointsWithContext) { + Assert.assertEquals(true, dataPoint.isUnreliable()); + } } - /// + @Test + public void when_setUnreliableDataPoint_with_meta_point_from_context_meta_points_then_unreliable_true() { + + //given: + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); + + //when: + setUnreliableDataPoint(dataPointRT); + + //then: + for(DataPointRT dataPoint: metaDataPointsWithContext) { + Assert.assertEquals(true, dataPoint.isUnreliable()); + } + } @Test - public void when_setUnreliableDataPoint_with_point_then_meta_points_unreliable() { + public void when_setUnreliableDataPoint_with_meta_point_from_context_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); //when: - setUnreliableDataPoint(dataPointRT1); + setUnreliableDataPoint(dataPointRT); //then: - for(DataPointRT dataPointRT: metaDataPoints) { - Assert.assertEquals(true, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + for(DataPointRT dataPoint: runtimeManager.getRunningMetaDataPoints(dataPointRT.getId())) { + Assert.assertEquals(true, dataPoint.isUnreliable()); } } @Test - public void when_setUnreliableDataPoints_with_points_then_meta_points_unreliable() { + public void when_setUnreliableDataPoints_with_virtual_points_from_context_meta_points_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: - setUnreliableDataPoints(dataPoints); + setUnreliableDataPoints(virtualDataPoints); //then: - for(DataPointRT dataPointRT: metaDataPoints) { - Assert.assertEquals(true, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + for(DataPointRT dataPoint: metaDataPointsWithContext) { + Assert.assertEquals(true, dataPoint.isUnreliable()); } } @Test - public void when_resetUnreliableDataPoints_with_point_then_meta_points_reliable() { + public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_points_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); //when: - resetUnreliableDataPoint(dataPointRT1); + setUnreliableDataPoint(dataPointRT); //then: - for(DataPointRT dataPointRT: metaDataPoints) { - Assert.assertEquals(false, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + for(DataPointRT dataPoint: runtimeManager.getRunningMetaDataPoints(dataPointRT.getId())) { + Assert.assertEquals(true, dataPoint.isUnreliable()); } } @Test - public void when_resetUnreliableDataPoints_with_points_then_meta_points_reliable() { + public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_point_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint2.getId()); + DataPointRT metaDataPointRT = runtimeManager.getDataPoint(metaDataPoint9WithVirtualDataPoint2.getId()); //when: - resetUnreliableDataPoints(dataPoints); + setUnreliableDataPoint(dataPointRT); //then: - for(DataPointRT dataPointRT: metaDataPoints) { - Assert.assertEquals(false, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + Assert.assertEquals(true, metaDataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoint_with_virtual_point_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + Assert.assertEquals(false, dataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoint_with_meta_point_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + Assert.assertEquals(false, dataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoint_with_meta_point_with_context_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint6WithVirtualDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + Assert.assertEquals(false, dataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoint_with_meta_point_from_context_meta_point_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + for(DataPointRT dataPoint: metaDataPointsWithContext) { + Assert.assertEquals(false, dataPoint.isUnreliable()); } } - /// + @Test + public void when_resetUnreliableDataPoints_with_meta_point_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + Assert.assertEquals(false, dataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoints_with_meta_points_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); + + //when: + resetUnreliableDataPoints(metaDataPoints); + + //then: + Assert.assertEquals(false, dataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoints_with_virtual_point_from_context_meta_point_then_meta_points_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + for(DataPointRT dataPoint: runtimeManager.getRunningMetaDataPoints(dataPointRT.getId())) { + Assert.assertEquals(false, dataPoint.isUnreliable()); + } + } @Test - public void when_not_invoke_setUnreliableDataPoints_or_setUnreliableDataPoint_then_false() { + public void when_resetUnreliableDataPoints_with_virtual_point_from_context_meta_point_then_meta_point_unreliable_false() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint2.getId()); + DataPointRT metaDataPointRT = runtimeManager.getDataPoint(metaDataPoint9WithVirtualDataPoint2.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); //then: - Assert.assertEquals(false, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY) != null); + Assert.assertEquals(false, metaDataPointRT.isUnreliable()); + } } \ No newline at end of file diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java new file mode 100644 index 0000000000..c8cea6f337 --- /dev/null +++ b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java @@ -0,0 +1,241 @@ +package com.serotonin.mango.rt.dataSource; + +import br.org.scadabr.rt.dataSource.alpha2.Alpha2DataSource; +import br.org.scadabr.rt.dataSource.asciiFile.ASCIIFileDataSource; +import br.org.scadabr.rt.dataSource.asciiSerial.ASCIISerialDataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3IpDataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3SerialDataSource; +import br.org.scadabr.rt.dataSource.drStorageHt5b.DrStorageHt5bDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101EthernetDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101SerialDataSource; +import br.org.scadabr.rt.dataSource.nodaves7.NodaveS7DataSource; +import br.org.scadabr.rt.dataSource.opc.OPCDataSource; +import br.org.scadabr.vo.dataSource.asciiFile.ASCIIFileDataSourceVO; +import br.org.scadabr.vo.dataSource.nodaves7.NodaveS7DataSourceVO; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoEventDataSource; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoPollingDataSource; +import com.i2msolucoes.alpha24j.layer.user.Alpha2Master; +import com.serotonin.mango.Common; +import com.serotonin.mango.rt.EventManager; +import com.serotonin.mango.rt.dataSource.bacnet.BACnetIPDataSourceRT; +import com.serotonin.mango.rt.dataSource.ebro.EBI25Constants; +import com.serotonin.mango.rt.dataSource.ebro.EBI25DataSourceRT; +import com.serotonin.mango.rt.dataSource.galil.GalilDataSourceRT; +import com.serotonin.mango.rt.dataSource.http.*; +import com.serotonin.mango.rt.dataSource.internal.InternalDataSourceRT; +import com.serotonin.mango.rt.dataSource.jmx.JmxDataSourceRT; +import com.serotonin.mango.rt.dataSource.mbus.MBusDataSourceRT; +import com.serotonin.mango.rt.dataSource.meta.MetaDataSourceRT; +import com.serotonin.mango.rt.dataSource.modbus.ModbusIpDataSource; +import com.serotonin.mango.rt.dataSource.modbus.ModbusSerialDataSource; +import com.serotonin.mango.rt.dataSource.nmea.NmeaDataSourceRT; +import com.serotonin.mango.rt.dataSource.onewire.OneWireDataSourceRT; +import com.serotonin.mango.rt.dataSource.openv4j.OpenV4JDataSourceRT; +import com.serotonin.mango.rt.dataSource.pachube.PachubeDataSourceRT; +import com.serotonin.mango.rt.dataSource.persistent.PersistentDataSourceRT; +import com.serotonin.mango.rt.dataSource.pop3.Pop3DataSourceRT; +import com.serotonin.mango.rt.dataSource.snmp.SnmpDataSourceRT; +import com.serotonin.mango.rt.dataSource.sql.SqlDataSourceRT; +import com.serotonin.mango.rt.dataSource.viconics.ViconicsDataSourceRT; +import com.serotonin.mango.rt.dataSource.virtual.VirtualDataSourceRT; +import com.serotonin.mango.rt.dataSource.vmstat.VMStatDataSourceRT; +import com.serotonin.mango.util.InitializeDataSourceRtMockUtils; +import com.serotonin.mango.util.SqlDataSourceUtils; +import com.serotonin.mango.vo.dataSource.http.HttpImageDataSourceVO; +import com.serotonin.mango.vo.dataSource.http.HttpRetrieverDataSourceVO; +import com.serotonin.mango.vo.dataSource.internal.InternalDataSourceVO; +import com.serotonin.mango.vo.dataSource.jmx.JmxDataSourceVO; +import com.serotonin.mango.vo.dataSource.mbus.MBusDataSourceVO; +import com.serotonin.mango.vo.dataSource.meta.MetaDataSourceVO; +import com.serotonin.mango.vo.dataSource.openv4j.OpenV4JDataSourceVO; +import com.serotonin.mango.vo.dataSource.persistent.PersistentDataSourceVO; +import com.serotonin.mango.vo.dataSource.pop3.Pop3DataSourceVO; +import com.serotonin.mango.vo.dataSource.virtual.VirtualDataSourceVO; +import com.serotonin.mango.vo.dataSource.vmstat.VMStatDataSourceVO; +import com.serotonin.mango.web.ContextWrapper; +import com.serotonin.modbus4j.ModbusFactory; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.scada_lts.ds.messaging.protocol.amqp.AmqpDataSourceVO; +import org.scada_lts.ds.messaging.protocol.mqtt.MqttDataSourceVO; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; + +import org.springframework.security.web.savedrequest.Enumerator; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.function.Supplier; + +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.wrap; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(Parameterized.class) +@PrepareForTest({Common.class, ASCIISerialDataSource.class, ScadaCommPortIdentifier.class, Alpha2DataSource.class, + Alpha2Master.class, BACnetIPDataSourceRT.class, Dnp3IpDataSource.class, Dnp3SerialDataSource.class, + EBI25DataSourceRT.class, EBI25Constants.class, NmeaDataSourceRT.class, Runtime.class, VMStatDataSourceRT.class, + ViconicsDataSourceRT.class, GalilDataSourceRT.class, IEC101EthernetDataSource.class, IEC101SerialDataSource.class, + ModbusFactory.class, OPCDataSource.class, OneWireDataSourceRT.class, SqlDataSourceUtils.class}) +@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", + "javax.activation.*", "javax.management.*"}) +public class InitializeDataSourceRtTest { + + @Parameterized.Parameters(name = "{index}: data source: {0}, raiseEventTimes: {2}, returnToNormalTimes: {3}") + public static Object[][] data() throws Exception { + + return new Object[][] { + + {ASCIISerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAsciiSerial), 1, 0}, + {Alpha2DataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAlpha2), 1, 0}, + {BACnetIPDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createBacNet), 3, 0}, + {Dnp3IpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDnp3Ip), 1, 0}, + {Dnp3SerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDnp3Serial), 1, 0}, + {DrStorageHt5bDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDrStorageMock), 1, 0}, + {EBI25DataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createEbi25), 1, 0}, + {NmeaDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createNmea), 1, 0}, + {RadiuinoEventDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createRadiuino), 1, 0}, + {RadiuinoPollingDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createRadiuinoPolling), 1, 0}, + {VMStatDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtTest::createVmStat), 1, 0}, + {ViconicsDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createViconics), 1, 0}, + {GalilDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createGalil), 1, 0}, + {IEC101EthernetDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createIec101Ethernet), 1, 0}, + {IEC101SerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createIec101Serial), 1, 0}, + {AmqpDataSourceVO.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAmqp), 1, 0}, + {MqttDataSourceVO.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createMqtt), 1, 0}, + {ModbusIpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, + {ModbusSerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, + {OPCDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createOpc), 1, 0}, + {OneWireDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createOneWire), 1, 0}, + {SqlDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSql), 1, 0}, + {HttpReceiverDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSql), 1, 0}, + {PachubeDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createPachube), 1, 0}, + {SnmpDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSnmp), 1, 0}, + {PersistentDataSourceRT.class.getSimpleName(), wrap(() -> new PersistentDataSourceRT(new PersistentDataSourceVO())), 1, 0}, + {ModbusIpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, + {ModbusSerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, + + + {VirtualDataSourceRT.class.getSimpleName(), wrap(() -> new VirtualDataSourceRT(new VirtualDataSourceVO())), 0, 0}, + {ASCIIFileDataSource.class.getSimpleName(), wrap(() -> new ASCIIFileDataSource(new ASCIIFileDataSourceVO<>())), 0, 0}, + {HttpImageDataSourceRT.class.getSimpleName(), wrap(() -> new HttpImageDataSourceRT(new HttpImageDataSourceVO())), 0, 0}, + {HttpRetrieverDataSourceRT.class.getSimpleName(), wrap(() -> new HttpRetrieverDataSourceRT(new HttpRetrieverDataSourceVO())), 0, 0}, + {InternalDataSourceRT.class.getSimpleName(), wrap(() -> new InternalDataSourceRT(new InternalDataSourceVO())), 0, 0}, + {JmxDataSourceRT.class.getSimpleName(), wrap(() -> new JmxDataSourceRT(new JmxDataSourceVO())), 0, 0}, + {MBusDataSourceRT.class.getSimpleName(), wrap(() -> new MBusDataSourceRT(new MBusDataSourceVO())), 0, 0}, + {MetaDataSourceRT.class.getSimpleName(), wrap(() -> new MetaDataSourceRT(new MetaDataSourceVO())), 0, 0}, + {NodaveS7DataSource.class.getSimpleName(), wrap(() -> new NodaveS7DataSource(new NodaveS7DataSourceVO<>())), 0, 0}, + {OpenV4JDataSourceRT.class.getSimpleName(), wrap(() -> new OpenV4JDataSourceRT(new OpenV4JDataSourceVO())), 0, 0}, + {Pop3DataSourceRT.class.getSimpleName(), wrap(() -> new Pop3DataSourceRT(new Pop3DataSourceVO())), 0, 0}, + + }; + } + + private DataSourceRT dataSourceRT; + private final int raiseEventTimes; + private final int returnToNormalTimes; + private final Supplier mockConfig; + + public InitializeDataSourceRtTest(String name, Supplier mockConfig, int raiseEventTimes, int returnToNormalTimes) { + this.raiseEventTimes = raiseEventTimes; + this.returnToNormalTimes = returnToNormalTimes; + this.mockConfig = mockConfig; + } + + private EventManager eventManager; + + @Before + public void config() throws Exception { + eventManager = mock(EventManager.class); + HttpReceiverMulticaster multicastListener = mock(HttpReceiverMulticaster.class); + + ContextWrapper contextWrapper = mock(ContextWrapper.class); + when(contextWrapper.getEventManager()).thenReturn(eventManager); + when(contextWrapper.getHttpReceiverMulticaster()).thenReturn(multicastListener); + + Common.ctx = contextWrapper; + + PowerMockito.mockStatic(ScadaCommPortIdentifier.class); + when(ScadaCommPortIdentifier.getPortIdentifiers()).thenReturn(new Enumerator(new ArrayList())); + + dataSourceRT = mockConfig.get(); + reset(eventManager); + } + + @After + public void clean() { + dataSourceRT.terminate(); + reset(eventManager); + } + + @Test + public void when_invoke_initialize_then_initialized() { + + //when: + dataSourceRT.initialize(); + + //then: + Assert.assertEquals(true, dataSourceRT.isInitialized()); + } + + + @Test + public void when_never_invoke_initialize_then_not_initialized() { + + //then: + Assert.assertEquals(false, dataSourceRT.isInitialized()); + } + + @Test + public void when_invoke_initialize_then_invoke_returnToNormal_times() { + + //when: + dataSourceRT.initialize(); + + //then: + Mockito.verify(eventManager, times(raiseEventTimes)).returnToNormal(any(), anyLong()); + } + + @Test + public void when_invoke_initialize_with_errors_then_invoke_raiseEvent_times() { + + //when: + dataSourceRT.initialize(); + + //then: + Mockito.verify(eventManager, times(returnToNormalTimes)).raiseEvent(any(), anyLong(), anyBoolean(), anyInt(), any(), anyMap()); + } + + public static DataSourceRT createVmStat() { + InputStream inputStreamMock = mock(InputStream.class); + Process processMock = mock(Process.class); + when(processMock.getInputStream()).thenReturn(inputStreamMock); + + java.lang.Runtime runtimeMock = mock(Runtime.class); + try { + when(runtimeMock.exec(anyString())).thenReturn(processMock); + PowerMockito.mockStatic(java.lang.Runtime.class); + when(java.lang.Runtime.getRuntime()).thenReturn(runtimeMock); + + BufferedReader bufferedReader = mock(BufferedReader.class); + when(bufferedReader.readLine()).thenReturn("abc"); + PowerMockito.whenNew(BufferedReader.class).withAnyArguments() + .thenReturn(bufferedReader); + } catch (Exception e) { + throw new RuntimeException(e); + } + return new VMStatDataSourceRT(new VMStatDataSourceVO()); + } +} diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java new file mode 100644 index 0000000000..c8f9356f16 --- /dev/null +++ b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java @@ -0,0 +1,12 @@ +package com.serotonin.mango.rt.dataSource; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + InitializeDataSourceRtTest.class, + InitializeWithErrorsDataSourceRtTest.class +}) +public class InitializeDataSourceRtTestsSuite { +} diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java new file mode 100644 index 0000000000..e6b0307357 --- /dev/null +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -0,0 +1,213 @@ +package com.serotonin.mango.rt.dataSource; + +import br.org.scadabr.rt.dataSource.alpha2.Alpha2DataSource; +import br.org.scadabr.rt.dataSource.asciiSerial.ASCIISerialDataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3IpDataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3SerialDataSource; +import br.org.scadabr.rt.dataSource.drStorageHt5b.DrStorageHt5bDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101EthernetDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101SerialDataSource; +import br.org.scadabr.rt.dataSource.opc.OPCDataSource; +import br.org.scadabr.vo.dataSource.alpha2.Alpha2DataSourceVO; +import br.org.scadabr.vo.dataSource.asciiSerial.ASCIISerialDataSourceVO; +import br.org.scadabr.vo.dataSource.dnp3.Dnp3IpDataSourceVO; +import br.org.scadabr.vo.dataSource.dnp3.Dnp3SerialDataSourceVO; +import br.org.scadabr.vo.dataSource.drStorageHt5b.DrStorageHt5bDataSourceVO; +import br.org.scadabr.vo.dataSource.iec101.IEC101EthernetDataSourceVO; +import br.org.scadabr.vo.dataSource.iec101.IEC101SerialDataSourceVO; +import br.org.scadabr.vo.dataSource.opc.OPCDataSourceVO; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoEventDataSource; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoPollingDataSource; +import cc.radiuino.scadabr.vo.datasource.radiuino.RadiuinoDataSourceVO; +import com.serotonin.mango.Common; +import com.serotonin.mango.rt.EventManager; +import com.serotonin.mango.rt.dataSource.bacnet.BACnetIPDataSourceRT; +import com.serotonin.mango.rt.dataSource.ebro.EBI25DataSourceRT; +import com.serotonin.mango.rt.dataSource.galil.GalilDataSourceRT; +import com.serotonin.mango.rt.dataSource.http.HttpReceiverDataSourceRT; +import com.serotonin.mango.rt.dataSource.modbus.ModbusDataSource; +import com.serotonin.mango.rt.dataSource.modbus.ModbusIpDataSource; +import com.serotonin.mango.rt.dataSource.modbus.ModbusSerialDataSource; +import com.serotonin.mango.rt.dataSource.nmea.NmeaDataSourceRT; +import com.serotonin.mango.rt.dataSource.onewire.OneWireDataSourceRT; +import com.serotonin.mango.rt.dataSource.pachube.PachubeDataSourceRT; +import com.serotonin.mango.rt.dataSource.persistent.PersistentDataSourceRT; +import com.serotonin.mango.rt.dataSource.snmp.SnmpDataSourceRT; +import com.serotonin.mango.rt.dataSource.sql.SqlDataSourceRT; +import com.serotonin.mango.rt.dataSource.viconics.ViconicsDataSourceRT; +import com.serotonin.mango.rt.dataSource.vmstat.VMStatDataSourceRT; +import com.serotonin.mango.vo.dataSource.bacnet.BACnetIPDataSourceVO; +import com.serotonin.mango.vo.dataSource.ebro.EBI25DataSourceVO; +import com.serotonin.mango.vo.dataSource.galil.GalilDataSourceVO; +import com.serotonin.mango.vo.dataSource.http.HttpReceiverDataSourceVO; +import com.serotonin.mango.vo.dataSource.modbus.ModbusIpDataSourceVO; +import com.serotonin.mango.vo.dataSource.modbus.ModbusSerialDataSourceVO; +import com.serotonin.mango.vo.dataSource.nmea.NmeaDataSourceVO; +import com.serotonin.mango.vo.dataSource.onewire.OneWireDataSourceVO; +import com.serotonin.mango.vo.dataSource.pachube.PachubeDataSourceVO; +import com.serotonin.mango.vo.dataSource.persistent.PersistentDataSourceVO; +import com.serotonin.mango.vo.dataSource.snmp.SnmpDataSourceVO; +import com.serotonin.mango.vo.dataSource.sql.SqlDataSourceVO; +import com.serotonin.mango.vo.dataSource.viconics.ViconicsDataSourceVO; +import com.serotonin.mango.vo.dataSource.vmstat.VMStatDataSourceVO; +import com.serotonin.mango.web.ContextWrapper; +import org.apache.derby.iapi.services.i18n.MessageService; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.scada_lts.ds.messaging.MessagingDataSourceRT; +import org.scada_lts.ds.messaging.protocol.amqp.AmqpDataSourceVO; +import org.scada_lts.ds.messaging.protocol.mqtt.MqttDataSourceVO; +import org.scada_lts.ds.messaging.service.MessagingService; +import org.scada_lts.ds.messaging.service.MessagingServiceFactory; + +import java.util.function.Supplier; + +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.modbusMock; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.wrap; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(Parameterized.class) +@PrepareForTest({Common.class}) +@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", + "javax.activation.*", "javax.management.*"}) +public class InitializeWithErrorsDataSourceRtTest { + + @Parameterized.Parameters(name = "{index}: data source: {1}") + public static Object[][] data() { + PersistentDataSourceVO persistentDataSourceVO = new PersistentDataSourceVO(); + persistentDataSourceVO.setPort(-1); + + ModbusIpDataSourceVO modbusIpDataSourceVO = new ModbusIpDataSourceVO(); + modbusIpDataSourceVO.setTransportType(ModbusIpDataSourceVO.TransportType.TCP_KEEP_ALIVE); + + BACnetIPDataSourceVO baCnetIPDataSourceVO = new BACnetIPDataSourceVO(); + baCnetIPDataSourceVO.setPort(47808); + + AmqpDataSourceVO amqpDataSourceVO = new AmqpDataSourceVO(); + MqttDataSourceVO mqttDataSourceVO = new MqttDataSourceVO(); + mqttDataSourceVO.setServerHost("localhost"); + mqttDataSourceVO.setServerPortNumber(1234); + + MessagingService messageServiceMock = mock(MessagingService.class); + doAnswer(a -> { + throw new RuntimeException(); + }).when(messageServiceMock).open(); + + return new Object[][] { + + {wrap(() -> new ASCIISerialDataSource(new ASCIISerialDataSourceVO<>())), ASCIISerialDataSource.class.getSimpleName()}, + {wrap(() -> new Alpha2DataSource(new Alpha2DataSourceVO<>())), Alpha2DataSource.class.getSimpleName()}, + {wrap(() -> new BACnetIPDataSourceRT(baCnetIPDataSourceVO)), BACnetIPDataSourceRT.class.getSimpleName()}, + {wrap(() -> new Dnp3IpDataSource(new Dnp3IpDataSourceVO())), Dnp3IpDataSource.class.getSimpleName()}, + {wrap(() -> new Dnp3SerialDataSource(new Dnp3SerialDataSourceVO())), Dnp3SerialDataSource.class.getSimpleName()}, + {wrap(() -> new DrStorageHt5bDataSource(new DrStorageHt5bDataSourceVO<>())), DrStorageHt5bDataSource.class.getSimpleName()}, + {wrap(() -> new EBI25DataSourceRT(new EBI25DataSourceVO())), EBI25DataSourceRT.class.getSimpleName()}, + {wrap(() -> new NmeaDataSourceRT(new NmeaDataSourceVO())), NmeaDataSourceRT.class.getSimpleName()}, + {wrap(() -> new RadiuinoEventDataSource(new RadiuinoDataSourceVO<>())), RadiuinoEventDataSource.class.getSimpleName()}, + {wrap(() -> new RadiuinoPollingDataSource(new RadiuinoDataSourceVO<>())), RadiuinoPollingDataSource.class.getSimpleName()}, + {wrap(() -> new VMStatDataSourceRT(new VMStatDataSourceVO())), VMStatDataSourceRT.class.getSimpleName()}, + {wrap(() -> new ViconicsDataSourceRT(new ViconicsDataSourceVO())), ViconicsDataSourceRT.class.getSimpleName()}, + {wrap(() -> new GalilDataSourceRT(new GalilDataSourceVO())), GalilDataSourceRT.class.getSimpleName()}, + {wrap(() -> new IEC101EthernetDataSource(new IEC101EthernetDataSourceVO())), IEC101EthernetDataSource.class.getSimpleName()}, + {wrap(() -> new IEC101SerialDataSource(new IEC101SerialDataSourceVO())), IEC101SerialDataSource.class.getSimpleName()}, + {wrap(() -> new MessagingDataSourceRT(amqpDataSourceVO, MessagingServiceFactory.newService(amqpDataSourceVO))), AmqpDataSourceVO.class.getSimpleName()}, + {wrap(() -> new MessagingDataSourceRT(mqttDataSourceVO, messageServiceMock)), MqttDataSourceVO.class.getSimpleName()}, + + {wrap(() -> new ModbusSerialDataSource(new ModbusSerialDataSourceVO())), ModbusSerialDataSource.class.getSimpleName()}, + {wrap(() -> new ModbusIpDataSource(modbusIpDataSourceVO)), ModbusIpDataSource.class.getSimpleName()}, + {wrap(() -> new OPCDataSource(new OPCDataSourceVO<>())), OPCDataSource.class.getSimpleName()}, + {wrap(() -> new OneWireDataSourceRT(new OneWireDataSourceVO())), OneWireDataSourceRT.class.getSimpleName()}, + {wrap(() -> new SqlDataSourceRT(new SqlDataSourceVO())), SqlDataSourceRT.class.getSimpleName()}, + {wrap(() -> new HttpReceiverDataSourceRT(new HttpReceiverDataSourceVO())), HttpReceiverDataSourceRT.class.getSimpleName()}, + {wrap(() -> new PachubeDataSourceRT(new PachubeDataSourceVO())), PachubeDataSourceRT.class.getSimpleName()}, + {wrap(() -> new SnmpDataSourceRT(new SnmpDataSourceVO())), SnmpDataSourceRT.class.getSimpleName()}, + {wrap(() -> new PersistentDataSourceRT(persistentDataSourceVO)), PersistentDataSourceRT.class.getSimpleName()}, + + }; + } + + private DataSourceRT dataSourceRT; + private final Supplier createDataSource; + + public InitializeWithErrorsDataSourceRtTest(Supplier createDataSource, String name) { + this.createDataSource = createDataSource; + } + + private EventManager eventManager; + + @Before + public void config() { + + eventManager = PowerMockito.mock(EventManager.class); + + ContextWrapper contextWrapper = PowerMockito.mock(ContextWrapper.class); + PowerMockito.when(contextWrapper.getEventManager()).thenReturn(eventManager); + + Common.ctx = contextWrapper; + + this.dataSourceRT = this.createDataSource.get(); + + if(dataSourceRT instanceof BACnetIPDataSourceRT) { + DataSourceRT dataSourceRT1 = this.createDataSource.get(); + dataSourceRT1.initialize(); + } + + reset(eventManager); + } + + @After + public void clean() { + dataSourceRT.terminate(); + } + + @Test + public void when_invoke_initialize_with_errors_then_not_initialized() { + + //when: + dataSourceRT.initialize(); + + //then: + Assert.assertEquals(false, dataSourceRT.isInitialized()); + } + + @Test + public void when_never_invoke_initialize_then_not_initialized() { + + //then: + Assert.assertEquals(false, dataSourceRT.isInitialized()); + } + + @Test + public void when_invoke_initialize_with_errors_then_one_raiseEvent() { + + //when: + dataSourceRT.initialize(); + + //then: + Mockito.verify(eventManager, times(1)).raiseEvent(any(), anyLong(), anyBoolean(), anyInt(), any(), anyMap()); + } + + @Test + public void when_invoke_initialize_with_errors_then_never_returnToNormal() { + + //when: + dataSourceRT.initialize(); + + //then: + Mockito.verify(eventManager, never()).returnToNormal(any(), anyLong()); + } + +} diff --git a/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java b/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java new file mode 100644 index 0000000000..227b38bb04 --- /dev/null +++ b/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java @@ -0,0 +1,443 @@ +package com.serotonin.mango.util; + +import br.org.scadabr.RealOPCMaster; +import br.org.scadabr.rt.dataSource.alpha2.Alpha2DataSource; +import br.org.scadabr.rt.dataSource.asciiSerial.ASCIISerialDataSource; +import br.org.scadabr.rt.dataSource.dnp3.DNP3Master; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3DataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3IpDataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3SerialDataSource; +import br.org.scadabr.rt.dataSource.drStorageHt5b.DrStorageHt5bDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101DataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101EthernetDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101Master; +import br.org.scadabr.rt.dataSource.iec101.IEC101SerialDataSource; +import br.org.scadabr.rt.dataSource.opc.OPCDataSource; +import br.org.scadabr.vo.dataSource.alpha2.Alpha2DataSourceVO; +import br.org.scadabr.vo.dataSource.asciiSerial.ASCIISerialDataSourceVO; +import br.org.scadabr.vo.dataSource.dnp3.Dnp3IpDataSourceVO; +import br.org.scadabr.vo.dataSource.dnp3.Dnp3SerialDataSourceVO; +import br.org.scadabr.vo.dataSource.drStorageHt5b.DrStorageHt5bDataSourceVO; +import br.org.scadabr.vo.dataSource.iec101.IEC101EthernetDataSourceVO; +import br.org.scadabr.vo.dataSource.iec101.IEC101SerialDataSourceVO; +import br.org.scadabr.vo.dataSource.opc.OPCDataSourceVO; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoEventDataSource; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoPollingDataSource; +import cc.radiuino.scadabr.vo.datasource.radiuino.RadiuinoDataSourceVO; +import com.i2msolucoes.alpha24j.layer.user.Alpha2Master; +import com.serotonin.bacnet4j.LocalDevice; +import com.serotonin.bacnet4j.event.DeviceEventHandler; +import com.serotonin.mango.Common; +import com.serotonin.mango.rt.dataImage.DataPointRT; +import com.serotonin.mango.rt.dataSource.DataSourceRT; +import com.serotonin.mango.rt.dataSource.bacnet.BACnetIPDataSourceRT; +import com.serotonin.mango.rt.dataSource.ebro.EBI25Constants; +import com.serotonin.mango.rt.dataSource.ebro.EBI25DataSourceRT; +import com.serotonin.mango.rt.dataSource.galil.GalilDataSourceRT; +import com.serotonin.mango.rt.dataSource.modbus.ModbusDataSource; +import com.serotonin.mango.rt.dataSource.modbus.ModbusIpDataSource; +import com.serotonin.mango.rt.dataSource.modbus.ModbusSerialDataSource; +import com.serotonin.mango.rt.dataSource.nmea.NmeaDataSourceRT; +import com.serotonin.mango.rt.dataSource.nmea.NmeaReceiver; +import com.serotonin.mango.rt.dataSource.onewire.Network; +import com.serotonin.mango.rt.dataSource.onewire.OneWireDataSourceRT; +import com.serotonin.mango.rt.dataSource.pachube.PachubeDataSourceRT; +import com.serotonin.mango.rt.dataSource.snmp.SnmpDataSourceRT; +import com.serotonin.mango.rt.dataSource.sql.SqlDataSourceRT; +import com.serotonin.mango.rt.dataSource.viconics.ViconicsDataSourceRT; +import com.serotonin.mango.util.timeout.TimeoutTask; +import com.serotonin.mango.vo.dataSource.bacnet.BACnetIPDataSourceVO; +import com.serotonin.mango.vo.dataSource.ebro.EBI25DataSourceVO; +import com.serotonin.mango.vo.dataSource.galil.GalilDataSourceVO; +import com.serotonin.mango.vo.dataSource.modbus.ModbusIpDataSourceVO; +import com.serotonin.mango.vo.dataSource.modbus.ModbusSerialDataSourceVO; +import com.serotonin.mango.vo.dataSource.nmea.NmeaDataSourceVO; +import com.serotonin.mango.vo.dataSource.onewire.OneWireDataSourceVO; +import com.serotonin.mango.vo.dataSource.pachube.PachubeDataSourceVO; +import com.serotonin.mango.vo.dataSource.snmp.SnmpDataSourceVO; +import com.serotonin.mango.vo.dataSource.sql.SqlDataSourceVO; +import com.serotonin.mango.vo.dataSource.viconics.ViconicsDataSourceVO; +import com.serotonin.modbus4j.ModbusMaster; +import com.serotonin.modbus4j.exception.ModbusInitException; +import com.serotonin.modbus4j.ip.tcp.TcpMaster; +import com.serotonin.modbus4j.serial.ascii.AsciiMaster; +import com.serotonin.modbus4j.serial.rtu.RtuMaster; +import com.serotonin.viconics.ViconicsNetwork; +import gnu.io.SerialPort; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.params.HttpClientParams; +import org.scada_lts.ds.messaging.MessagingDataSourceRT; +import org.scada_lts.ds.messaging.protocol.amqp.AmqpDataSourceVO; +import org.scada_lts.ds.messaging.protocol.mqtt.MqttDataSourceVO; +import org.scada_lts.ds.messaging.service.MessagingService; +import org.scada_lts.ds.messaging.service.MessagingServiceFactory; +import org.snmp4j.mp.SnmpConstants; +import org.springframework.jdbc.core.JdbcOperations; + +import javax.naming.NamingException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.util.List; +import java.util.function.Supplier; + +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoints; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.setUnreliableDataPoints; +import static org.mockito.ArgumentMatchers.*; +import static org.powermock.api.mockito.PowerMockito.*; +import static org.powermock.api.mockito.PowerMockito.whenNew; + +public final class InitializeDataSourceRtMockUtils { + + private InitializeDataSourceRtMockUtils() {} + + public static SqlDataSourceRT createSql() { + SqlDataSourceRT dataSource = new SqlDataSourceRT(new SqlDataSourceVO()); + sqlMock(dataSource); + return dataSource; + } + + public static OneWireDataSourceRT createOneWire() { + OneWireDataSourceRT dataSource = new OneWireDataSourceRT(new OneWireDataSourceVO()); + oneWireMock(dataSource); + return dataSource; + } + + public static OPCDataSource createOpc() { + OPCDataSource dataSource = new OPCDataSource(new OPCDataSourceVO<>()); + opcMock(dataSource); + return dataSource; + } + + public static ModbusDataSource createModbusIpDataSource() { + ModbusDataSource dataSource = new ModbusIpDataSource(new ModbusIpDataSourceVO()); + modbusMock(dataSource); + return dataSource; + } + + public static ModbusDataSource createModbusSerialDataSource() { + ModbusDataSource dataSource = new ModbusSerialDataSource(new ModbusSerialDataSourceVO()); + modbusMock(dataSource); + return dataSource; + } + + public static IEC101DataSource createIec101Ethernet() { + IEC101DataSource dataSource = new IEC101EthernetDataSource(new IEC101EthernetDataSourceVO()); + iec101Mock(dataSource); + return dataSource; + } + + public static IEC101DataSource createIec101Serial() { + IEC101DataSource dataSource = new IEC101SerialDataSource(new IEC101SerialDataSourceVO()); + iec101Mock(dataSource); + return dataSource; + } + + public static ViconicsDataSourceRT createViconics() { + ViconicsDataSourceRT dataSource = new ViconicsDataSourceRT(new ViconicsDataSourceVO()); + viconicsMock(dataSource); + return dataSource; + } + + public static NmeaDataSourceRT createNmea() { + NmeaDataSourceRT dataSource = new NmeaDataSourceRT(new NmeaDataSourceVO()); + nmeaMock(dataSource); + return dataSource; + } + + public static EBI25DataSourceRT createEbi25() { + EBI25DataSourceRT dataSource = new EBI25DataSourceRT(new EBI25DataSourceVO()); + ebi25Mock(dataSource); + return dataSource; + } + + public static Alpha2DataSource createAlpha2() { + Alpha2DataSource dataSource = new Alpha2DataSource(new Alpha2DataSourceVO<>()); + alpha2Mock(dataSource); + return dataSource; + } + + public static Dnp3DataSource createDnp3Ip() { + Dnp3DataSource dataSource = new Dnp3IpDataSource(new Dnp3IpDataSourceVO()); + dnp3Mock(dataSource); + return dataSource; + } + + public static Dnp3DataSource createDnp3Serial() { + Dnp3DataSource dataSource = new Dnp3SerialDataSource(new Dnp3SerialDataSourceVO()); + dnp3Mock(dataSource); + return dataSource; + } + + public static BACnetIPDataSourceRT createBacNet() { + BACnetIPDataSourceRT dataSource = new BACnetIPDataSourceRT(new BACnetIPDataSourceVO()); + bacNetMock(dataSource); + return dataSource; + } + + public static PachubeDataSourceRT createPachube() { + PachubeDataSourceRT dataSource = new PachubeDataSourceRT(new PachubeDataSourceVO()); + pachubeMock(dataSource); + return dataSource; + } + + public static ASCIISerialDataSource createAsciiSerial() { + ASCIISerialDataSource dataSource = new ASCIISerialDataSource(new ASCIISerialDataSourceVO<>()); + asciiSerialMock(dataSource); + return dataSource; + } + + public static RadiuinoEventDataSource createRadiuino() { + RadiuinoEventDataSource dataSource = new RadiuinoEventDataSource(new RadiuinoDataSourceVO<>()); + radiuinoMock(dataSource); + return dataSource; + } + + public static RadiuinoPollingDataSource createRadiuinoPolling() { + RadiuinoPollingDataSource dataSource = new RadiuinoPollingDataSource(new RadiuinoDataSourceVO<>()); + radiuinoPollingMock(dataSource); + return dataSource; + } + + public static DrStorageHt5bDataSource createDrStorageMock() { + DrStorageHt5bDataSource dataSource = new DrStorageHt5bDataSource(new DrStorageHt5bDataSourceVO<>()); + drStorageMock(dataSource); + return dataSource; + } + + public static MessagingDataSourceRT createAmqp() { + AmqpDataSourceVO amqpDataSourceVO = new AmqpDataSourceVO(); + MessagingService messagingService = mock(MessagingService.class); + return new MessagingDataSourceRT(amqpDataSourceVO, messagingService); + } + + public static MessagingDataSourceRT createMqtt() { + MqttDataSourceVO mqttDataSourceVO = new MqttDataSourceVO(); + MessagingService messagingService = MessagingServiceFactory.newService(mqttDataSourceVO); + return new MessagingDataSourceRT(mqttDataSourceVO, messagingService); + } + + public static SnmpDataSourceRT createSnmp() { + SnmpDataSourceVO snmpDataSourceVO = new SnmpDataSourceVO(); + snmpDataSourceVO.setSnmpVersion(SnmpConstants.version1); + snmpDataSourceVO.setCommunity("comm"); + SnmpDataSourceRT dataSource = new SnmpDataSourceRT(snmpDataSourceVO); + return dataSource; + } + + public static GalilDataSourceRT createGalil() { + GalilDataSourceVO galilDataSourceVO = new GalilDataSourceVO(); + galilDataSourceVO.setHost("localhost"); + galilDataSourceVO.setTimeout(1); + galilDataSourceVO.setPort(1111); + GalilDataSourceRT dataSource = new GalilDataSourceRT(galilDataSourceVO); + galilMock(dataSource); + return dataSource; + } + + public static Supplier wrap(Supplier function) { + return function; + } + + public static void reset(List list1, List list2, List list3) { + resetUnreliableDataPoints(list1); + resetUnreliableDataPoints(list2); + resetUnreliableDataPoints(list3); + } + + public static void set(List list1, List list2, List list3) { + setUnreliableDataPoints(list1); + setUnreliableDataPoints(list2); + setUnreliableDataPoints(list3); + } + + private static void sqlMock(SqlDataSourceRT dataSource) { + mockStatic(SqlDataSourceUtils.class); + JdbcOperations jdbcOperations = mock(JdbcOperations.class); + when(jdbcOperations.queryForObject(anyString(), eq(int.class))).thenReturn(1); + try { + when(SqlDataSourceUtils.createJdbcOperations(any())) + .thenReturn(jdbcOperations); + } catch (NamingException e) { + throw new RuntimeException(e); + } + } + + private static void oneWireMock(OneWireDataSourceRT dataSource) { + Network networkMock = mock(Network.class); + try { + whenNew(Network.class).withAnyArguments() + .thenReturn(networkMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void opcMock(OPCDataSource dataSource) { + RealOPCMaster realOPCMasterMock = mock(RealOPCMaster.class); + try { + whenNew(RealOPCMaster.class).withAnyArguments() + .thenReturn(realOPCMasterMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static void modbusMock(ModbusDataSource dataSource) { + AsciiMaster asciiMasterMock = mock(AsciiMaster.class); + TcpMaster tcpMasterMock = mock(TcpMaster.class); + RtuMaster rtuMasterMock = mock(RtuMaster.class); + try { + whenNew(AsciiMaster.class).withAnyArguments() + .thenReturn(asciiMasterMock); + whenNew(TcpMaster.class).withAnyArguments() + .thenReturn(tcpMasterMock); + whenNew(RtuMaster.class).withAnyArguments() + .thenReturn(rtuMasterMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void iec101Mock(IEC101DataSource dataSource) { + IEC101Master iec101MasterMock = mock(IEC101Master.class); + try { + whenNew(IEC101Master.class).withAnyArguments() + .thenReturn(iec101MasterMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void galilMock(GalilDataSourceRT dataSource) { + InputStream inputStreamMock = mock(InputStream.class); + OutputStream outputStreamMock = mock(OutputStream.class); + + Socket socketMock = mock(Socket.class); + + try { + doAnswer(a -> { + return null; + }).when(socketMock).connect(any()); + + when(socketMock.getInputStream()).thenReturn(inputStreamMock); + when(socketMock.getOutputStream()).thenReturn(outputStreamMock); + + whenNew(Socket.class).withAnyArguments() + .thenReturn(socketMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void viconicsMock(ViconicsDataSourceRT dataSource) { + ViconicsNetwork viconicsNetworkMock = mock(ViconicsNetwork.class); + try { + whenNew(ViconicsNetwork.class).withAnyArguments() + .thenReturn(viconicsNetworkMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void nmeaMock(NmeaDataSourceRT dataSource) { + NmeaReceiver nmeaReceiverMock = mock(NmeaReceiver.class); + TimeoutTask timeoutTaskMock = mock(TimeoutTask.class); + try { + whenNew(NmeaReceiver.class).withAnyArguments() + .thenReturn(nmeaReceiverMock); + whenNew(TimeoutTask.class).withAnyArguments() + .thenReturn(timeoutTaskMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void ebi25Mock(EBI25DataSourceRT dataSource) { + ModbusMaster modbusMasterMock = mock(ModbusMaster.class); + mockStatic(EBI25Constants.class); + try { + when(EBI25Constants.initModbusMaster(anyString(), anyInt(), anyBoolean(), anyInt(), anyInt(), any())) + .thenReturn(modbusMasterMock); + } catch (ModbusInitException e) { + throw new RuntimeException(e); + } + } + + private static void alpha2Mock(Alpha2DataSource dataSource) { + Alpha2Master alpha2MasterMock = mock(Alpha2Master.class); + try { + doAnswer(invocation -> { + return null; + }).when(alpha2MasterMock).init(); + whenNew(Alpha2Master.class) + .withAnyArguments() + .thenReturn(alpha2MasterMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void dnp3Mock(Dnp3DataSource dataSource) { + DNP3Master dnp3MasterMock = mock(DNP3Master.class); + try { + whenNew(DNP3Master.class) + .withAnyArguments() + .thenReturn(dnp3MasterMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void bacNetMock(BACnetIPDataSourceRT dataSource) { + LocalDevice localDeviceMock = mock(LocalDevice.class); + + DeviceEventHandler deviceEventHandlerMock = mock(DeviceEventHandler.class); + when(localDeviceMock.getEventHandler()).thenReturn(deviceEventHandlerMock); + when(localDeviceMock.isInitialized()).thenReturn(true); + + try { + whenNew(LocalDevice.class) + .withAnyArguments() + .thenReturn(localDeviceMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void pachubeMock(PachubeDataSourceRT dataSource) { + HttpClient httpClient = mock(HttpClient.class); + when(httpClient.getParams()).thenReturn(new HttpClientParams()); + mockStatic(Common.class); + when(Common.getHttpClient(anyInt())).thenReturn(httpClient); + } + + private static void asciiSerialMock(ASCIISerialDataSource dataSource) { + SerialPort serialPortMock = mock(SerialPort.class); + dataSource.setsPort(serialPortMock); + } + + private static void radiuinoMock(RadiuinoEventDataSource dataSource) { + SerialPort serialPortMock = mock(SerialPort.class); + dataSource.setsPort(serialPortMock); + } + + private static void radiuinoPollingMock(RadiuinoPollingDataSource dataSource) { + SerialPort serialPortMock = mock(SerialPort.class); + dataSource.setsPort(serialPortMock); + } + + private static void drStorageMock(DrStorageHt5bDataSource dataSource) { + SerialPort serialPortMock = mock(SerialPort.class); + dataSource.setsPort(serialPortMock); + InputStream inputStreamMock = mock(InputStream.class); + try { + when(inputStreamMock.available()).thenReturn(1); + } catch (IOException e) { + throw new RuntimeException(e); + } + dataSource.setInSerialStream(inputStreamMock); + dataSource.setsPort(serialPortMock); + } +} diff --git a/webapp-resources/log4j2.xml b/webapp-resources/log4j2.xml index 60a337baf5..9e003e9c99 100644 --- a/webapp-resources/log4j2.xml +++ b/webapp-resources/log4j2.xml @@ -34,8 +34,8 @@ ERROR ERROR ERROR - WARN - WARN + ERROR + ERROR ERROR From 1f01b33c339dfd45cd23c948aa4e1ee14ce6fef7 Mon Sep 17 00:00:00 2001 From: Kamil Date: Tue, 27 Feb 2024 08:48:12 +0100 Subject: [PATCH 09/63] #2755 Signaling the data source that has a problem: - corrected test: InitializeWithErrorsDataSourceRtTest; - change type catch from IOException to Throwable; --- .../dataSource/vmstat/VMStatDataSourceRT.java | 2 +- .../InitializeWithErrorsDataSourceRtTest.java | 20 ++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java index bb36105dde..9ff2fc32c1 100644 --- a/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java @@ -139,7 +139,7 @@ else if ("st".equals(headerParts[i])) returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } - catch (IOException e) { + catch (Throwable e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); return; diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java index e6b0307357..b1ae87e2f4 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -25,7 +25,6 @@ import com.serotonin.mango.rt.dataSource.ebro.EBI25DataSourceRT; import com.serotonin.mango.rt.dataSource.galil.GalilDataSourceRT; import com.serotonin.mango.rt.dataSource.http.HttpReceiverDataSourceRT; -import com.serotonin.mango.rt.dataSource.modbus.ModbusDataSource; import com.serotonin.mango.rt.dataSource.modbus.ModbusIpDataSource; import com.serotonin.mango.rt.dataSource.modbus.ModbusSerialDataSource; import com.serotonin.mango.rt.dataSource.nmea.NmeaDataSourceRT; @@ -51,7 +50,6 @@ import com.serotonin.mango.vo.dataSource.viconics.ViconicsDataSourceVO; import com.serotonin.mango.vo.dataSource.vmstat.VMStatDataSourceVO; import com.serotonin.mango.web.ContextWrapper; -import org.apache.derby.iapi.services.i18n.MessageService; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -65,14 +63,15 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunnerDelegate; import org.scada_lts.ds.messaging.MessagingDataSourceRT; +import org.scada_lts.ds.messaging.exception.MessagingServiceException; import org.scada_lts.ds.messaging.protocol.amqp.AmqpDataSourceVO; import org.scada_lts.ds.messaging.protocol.mqtt.MqttDataSourceVO; import org.scada_lts.ds.messaging.service.MessagingService; import org.scada_lts.ds.messaging.service.MessagingServiceFactory; +import java.io.IOException; import java.util.function.Supplier; -import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.modbusMock; import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.wrap; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -103,7 +102,7 @@ public static Object[][] data() { MessagingService messageServiceMock = mock(MessagingService.class); doAnswer(a -> { - throw new RuntimeException(); + throw new MessagingServiceException(); }).when(messageServiceMock).open(); return new Object[][] { @@ -166,6 +165,18 @@ public void config() { } reset(eventManager); + + java.lang.Runtime runtimeMock = mock(Runtime.class); + try { + doAnswer(a -> { + throw new IOException(); + }).when(runtimeMock).exec(anyString()); + PowerMockito.mockStatic(java.lang.Runtime.class); + when(java.lang.Runtime.getRuntime()).thenReturn(runtimeMock); + + } catch (Exception e) { + throw new RuntimeException(e); + } } @After @@ -209,5 +220,4 @@ public void when_invoke_initialize_with_errors_then_never_returnToNormal() { //then: Mockito.verify(eventManager, never()).returnToNormal(any(), anyLong()); } - } From d2f79e2aa89df9ab1483fb57f0d6ca44ba1086d7 Mon Sep 17 00:00:00 2001 From: Kamil Date: Tue, 27 Feb 2024 08:59:28 +0100 Subject: [PATCH 10/63] #2755 Signaling the data source that has a problem: - corrected test: InitializeWithErrorsDataSourceRtTest for VMStatDataSourceRT - update PrepareForTest annotation, if dataSourceRT instanceof VMStatDataSourceRT, for MessagingDataSourceRT with MQTT throw MessagingServiceException after invoke MessageService.open; --- .../InitializeWithErrorsDataSourceRtTest.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java index b1ae87e2f4..cb8759df50 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -79,7 +79,7 @@ @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(Parameterized.class) -@PrepareForTest({Common.class}) +@PrepareForTest({Common.class, Runtime.class, VMStatDataSourceRT.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class InitializeWithErrorsDataSourceRtTest { @@ -102,7 +102,7 @@ public static Object[][] data() { MessagingService messageServiceMock = mock(MessagingService.class); doAnswer(a -> { - throw new MessagingServiceException(); + throw new MessagingServiceException("From test"); }).when(messageServiceMock).open(); return new Object[][] { @@ -166,16 +166,18 @@ public void config() { reset(eventManager); - java.lang.Runtime runtimeMock = mock(Runtime.class); - try { - doAnswer(a -> { - throw new IOException(); - }).when(runtimeMock).exec(anyString()); - PowerMockito.mockStatic(java.lang.Runtime.class); - when(java.lang.Runtime.getRuntime()).thenReturn(runtimeMock); - - } catch (Exception e) { - throw new RuntimeException(e); + if(dataSourceRT instanceof VMStatDataSourceRT) { + java.lang.Runtime runtimeMock = mock(Runtime.class); + try { + doAnswer(a -> { + throw new IOException("From test"); + }).when(runtimeMock).exec(anyString()); + PowerMockito.mockStatic(java.lang.Runtime.class); + when(java.lang.Runtime.getRuntime()).thenReturn(runtimeMock); + + } catch (Exception e) { + throw new RuntimeException(e); + } } } From d494a84c054a7bd4021882de61d8135598aa4bdb Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 28 Feb 2024 07:19:36 +0100 Subject: [PATCH 11/63] #2755 Signaling the data source that has a problem: - fixed generate many events by ModbusDataSource; - corrected test InitializeDataSourceRtTest; - refactor InitializeDataSourceRtMockUtils; --- .../dataSource/galil/GalilDataSourceRT.java | 2 + .../dataSource/modbus/ModbusDataSource.java | 9 +- .../dataSource/modbus/ModbusDataSourceVO.java | 4 + .../DataPointUnreliableUtilsTest.java | 92 ++++++------------- .../InitializeDataSourceRtTest.java | 90 +++++++++--------- .../InitializeWithErrorsDataSourceRtTest.java | 56 +++++------ .../util/InitializeDataSourceRtMockUtils.java | 74 +++++++++++---- 7 files changed, 164 insertions(+), 163 deletions(-) diff --git a/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java index 2a0c7bd624..62d30be4a8 100644 --- a/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java @@ -109,6 +109,7 @@ synchronized protected void doPoll(long time) { // Raise an event. raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.pollingError", messageException.getMessage())); + return; } else // Deactivate any existing event. @@ -117,6 +118,7 @@ synchronized protected void doPoll(long time) { if (pointError != null) { // Raise an event. raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, pointError); + return; } else // Deactivate any existing event. diff --git a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java index 720138125b..d603047bb7 100644 --- a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java @@ -63,6 +63,7 @@ abstract public class ModbusDataSource extends PollingDataSource implements public static final int POINT_WRITE_EXCEPTION_EVENT = 2; public static final int DATA_SOURCE_EXCEPTION_EVENT = 3; public static final int MONITOR_WRITE_EXCEPTION_EVENT = 4; + public static final int INITIALIZATION_EXCEPTION_EVENT = 5; private ModbusMaster modbusMaster; private BatchRead batchRead; @@ -154,9 +155,9 @@ public void removeDataPoint(DataPointRT dataPoint) { protected void doPoll(long time) { try { checkInitialized(modbusMaster, this); - returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); + returnToNormal(INITIALIZATION_EXCEPTION_EVENT, time); } catch (Throwable e) { - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, + raiseEvent(INITIALIZATION_EXCEPTION_EVENT, time, true, getLocalExceptionMessage(e)); return; } @@ -355,10 +356,10 @@ protected void initialize(ModbusMaster modbusMaster) { modbusMaster.init(); // Deactivate any existing event. - returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, + returnToNormal(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), + raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, getLocalExceptionMessage(e)); return; } diff --git a/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java b/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java index ff7e0b4ad5..4acea0b155 100644 --- a/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java +++ b/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java @@ -54,6 +54,8 @@ protected void addEventTypes(List ets) { new LocalizableMessage("event.ds.pointWrite"))); ets.add(createEventType(ModbusDataSource.MONITOR_WRITE_EXCEPTION_EVENT, new LocalizableMessage("event.ds.monitorWrite"))); + ets.add(createEventType(ModbusDataSource.INITIALIZATION_EXCEPTION_EVENT, + new LocalizableMessage("event.ds.initialization"))); } private static final ExportCodes EVENT_CODES = new ExportCodes(); @@ -66,6 +68,8 @@ protected void addEventTypes(List ets) { "POINT_WRITE_EXCEPTION"); EVENT_CODES.addElement(ModbusDataSource.MONITOR_WRITE_EXCEPTION_EVENT, "MONITOR_WRITE_EXCEPTION"); + EVENT_CODES.addElement(ModbusDataSource.INITIALIZATION_EXCEPTION_EVENT, + "INITIALIZATION_EXCEPTION"); } @Override diff --git a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java index e1f052c28e..4cdb810e19 100644 --- a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java +++ b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java @@ -9,14 +9,12 @@ import com.serotonin.mango.rt.RuntimeManager; import com.serotonin.mango.rt.dataImage.DataPointRT; import com.serotonin.mango.rt.dataImage.PointValueCache; -import com.serotonin.mango.rt.maint.BackgroundProcessing; import com.serotonin.mango.vo.DataPointVO; import com.serotonin.mango.vo.TimePeriodType; import com.serotonin.mango.vo.dataSource.meta.MetaDataSourceVO; import com.serotonin.mango.vo.dataSource.meta.MetaPointLocatorVO; import com.serotonin.mango.vo.dataSource.virtual.VirtualDataSourceVO; import com.serotonin.mango.vo.dataSource.virtual.VirtualPointLocatorVO; -import com.serotonin.mango.web.ContextWrapper; import com.serotonin.mango.web.dwr.MiscDwr; import com.serotonin.web.content.ContentGenerator; import org.directwebremoting.WebContextFactory; @@ -28,12 +26,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.scada_lts.dao.SystemSettingsDAO; -import org.scada_lts.mango.service.DataPointService; -import org.scada_lts.mango.service.DataSourceService; -import org.scada_lts.mango.service.PointValueService; -import org.scada_lts.mango.service.SystemSettingsService; import org.scada_lts.web.beans.ApplicationBeans; -import org.scada_lts.web.ws.services.DataPointServiceWebSocket; import java.util.ArrayList; import java.util.Arrays; @@ -41,10 +34,10 @@ import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoints; -import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.reset; -import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.set; -import static org.mockito.ArgumentMatchers.anyString; -import static org.powermock.api.mockito.PowerMockito.*; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.resetUnreliable; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.setUnreliable; +import static org.mockito.Mockito.mock; +import static utils.mock.RuntimeMockUtils.runtimeManagerMock; @RunWith(PowerMockRunner.class) @PrepareForTest({WebContextFactory.class, Common.class, MiscDwr.class, SystemSettingsDAO.class, @@ -80,40 +73,7 @@ public class DataPointUnreliableUtilsTest { @Before public void configMock() throws Exception { - DataSourceService dataSourceService = mock(DataSourceService.class); - whenNew(DataSourceService.class).withNoArguments().thenReturn(dataSourceService); - - DataPointService dataPointService = mock(DataPointService.class); - whenNew(DataPointService.class).withNoArguments().thenReturn(dataPointService); - - SystemSettingsService systemSettingsService = mock(SystemSettingsService.class); - whenNew(SystemSettingsService.class).withNoArguments().thenReturn(systemSettingsService); - - SystemSettingsDAO systemSettingsDAO = mock(SystemSettingsDAO.class); - whenNew(SystemSettingsDAO.class).withNoArguments().thenReturn(systemSettingsDAO); - - mockStatic(SystemSettingsDAO.class); - when(SystemSettingsDAO.getValue(anyString())).thenReturn(""); - when(SystemSettingsDAO.getFutureDateLimit()).thenReturn(1L); - - PointValueService mangoPointValues = mock(PointValueService.class); - whenNew(PointValueService.class).withNoArguments().thenReturn(mangoPointValues); - - mockStatic(ApplicationBeans.class); - DataPointServiceWebSocket dataPointServiceWebSocket = mock(DataPointServiceWebSocket.class); - when(ApplicationBeans.getDataPointServiceWebSocketBean()).thenReturn(dataPointServiceWebSocket); - - ContextWrapper contextWrapper = mock(ContextWrapper.class); - EventManager eventManager = mock(EventManager.class); - BackgroundProcessing backgroundProcessing = mock(BackgroundProcessing.class); - - runtimeManager = new RuntimeManager(); - when(contextWrapper.getRuntimeManager()).thenReturn(runtimeManager); - when(contextWrapper.getEventManager()).thenReturn(eventManager); - when(contextWrapper.getBackgroundProcessing()).thenReturn(backgroundProcessing); - - Common.ctx = contextWrapper; - Common.timer.init(); + runtimeManagerMock(this.runtimeManager = new RuntimeManager(), mock(EventManager.class)); configData(); } @@ -213,7 +173,7 @@ private void configData() { public void when_setUnreliableDataPoints_with_virtual_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(virtualDataPoints); @@ -228,7 +188,7 @@ public void when_setUnreliableDataPoints_with_virtual_points_then_unreliable_tru public void when_setUnreliableDataPoints_with_meta_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(metaDataPoints); @@ -243,7 +203,7 @@ public void when_setUnreliableDataPoints_with_meta_points_then_unreliable_true() public void when_setUnreliableDataPoints_with_meta_points_with_context_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(metaDataPointsWithContext); @@ -291,7 +251,7 @@ public void when_getRunningDataSource_meta_data_source_with_context_then_initial public void when_setUnreliableDataPoint_with_virtual_point_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); //when: @@ -306,7 +266,7 @@ public void when_setUnreliableDataPoint_with_virtual_point_then_unreliable_true( public void when_setUnreliableDataPoint_with_meta_point_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); //when: @@ -321,7 +281,7 @@ public void when_setUnreliableDataPoint_with_meta_point_then_unreliable_true() { public void when_setUnreliableDataPoint_with_meta_point_with_context_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint6WithVirtualDataPoint1.getId()); //when: @@ -336,7 +296,7 @@ public void when_setUnreliableDataPoint_with_meta_point_with_context_then_unreli public void when_setUnreliableDataPoints_with_virtual_points_then_meta_points_unreliable_false() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(virtualDataPoints); @@ -351,7 +311,7 @@ public void when_setUnreliableDataPoints_with_virtual_points_then_meta_points_un public void when_setUnreliableDataPoints_with_virtual_points_from_meta_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(virtualDataPoints); @@ -366,7 +326,7 @@ public void when_setUnreliableDataPoints_with_virtual_points_from_meta_points_th public void when_setUnreliableDataPoint_with_meta_point_from_context_meta_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); //when: @@ -382,7 +342,7 @@ public void when_setUnreliableDataPoint_with_meta_point_from_context_meta_points public void when_setUnreliableDataPoint_with_meta_point_from_context_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); //when: @@ -398,7 +358,7 @@ public void when_setUnreliableDataPoint_with_meta_point_from_context_then_unreli public void when_setUnreliableDataPoints_with_virtual_points_from_context_meta_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(virtualDataPoints); @@ -413,7 +373,7 @@ public void when_setUnreliableDataPoints_with_virtual_points_from_context_meta_p public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); //when: @@ -429,7 +389,7 @@ public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_poi public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_point_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint2.getId()); DataPointRT metaDataPointRT = runtimeManager.getDataPoint(metaDataPoint9WithVirtualDataPoint2.getId()); @@ -445,7 +405,7 @@ public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_poi public void when_resetUnreliableDataPoint_with_virtual_point_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); //when: @@ -460,7 +420,7 @@ public void when_resetUnreliableDataPoint_with_virtual_point_then_unreliable_fal public void when_resetUnreliableDataPoint_with_meta_point_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); //when: @@ -475,7 +435,7 @@ public void when_resetUnreliableDataPoint_with_meta_point_then_unreliable_false( public void when_resetUnreliableDataPoint_with_meta_point_with_context_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint6WithVirtualDataPoint1.getId()); //when: @@ -490,7 +450,7 @@ public void when_resetUnreliableDataPoint_with_meta_point_with_context_then_unre public void when_resetUnreliableDataPoint_with_meta_point_from_context_meta_point_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); //when: @@ -506,7 +466,7 @@ public void when_resetUnreliableDataPoint_with_meta_point_from_context_meta_poin public void when_resetUnreliableDataPoints_with_meta_point_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); //when: @@ -521,7 +481,7 @@ public void when_resetUnreliableDataPoints_with_meta_point_then_unreliable_false public void when_resetUnreliableDataPoints_with_meta_points_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); //when: @@ -536,7 +496,7 @@ public void when_resetUnreliableDataPoints_with_meta_points_then_unreliable_fals public void when_resetUnreliableDataPoints_with_virtual_point_from_context_meta_point_then_meta_points_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); //when: @@ -552,7 +512,7 @@ public void when_resetUnreliableDataPoints_with_virtual_point_from_context_meta_ public void when_resetUnreliableDataPoints_with_virtual_point_from_context_meta_point_then_meta_point_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint2.getId()); DataPointRT metaDataPointRT = runtimeManager.getDataPoint(metaDataPoint9WithVirtualDataPoint2.getId()); diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java index c8cea6f337..2be4d05b89 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java @@ -77,7 +77,7 @@ import java.util.ArrayList; import java.util.function.Supplier; -import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.wrap; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.supplier; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -98,47 +98,47 @@ public static Object[][] data() throws Exception { return new Object[][] { - {ASCIISerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAsciiSerial), 1, 0}, - {Alpha2DataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAlpha2), 1, 0}, - {BACnetIPDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createBacNet), 3, 0}, - {Dnp3IpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDnp3Ip), 1, 0}, - {Dnp3SerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDnp3Serial), 1, 0}, - {DrStorageHt5bDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDrStorageMock), 1, 0}, - {EBI25DataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createEbi25), 1, 0}, - {NmeaDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createNmea), 1, 0}, - {RadiuinoEventDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createRadiuino), 1, 0}, - {RadiuinoPollingDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createRadiuinoPolling), 1, 0}, - {VMStatDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtTest::createVmStat), 1, 0}, - {ViconicsDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createViconics), 1, 0}, - {GalilDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createGalil), 1, 0}, - {IEC101EthernetDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createIec101Ethernet), 1, 0}, - {IEC101SerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createIec101Serial), 1, 0}, - {AmqpDataSourceVO.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAmqp), 1, 0}, - {MqttDataSourceVO.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createMqtt), 1, 0}, - {ModbusIpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, - {ModbusSerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, - {OPCDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createOpc), 1, 0}, - {OneWireDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createOneWire), 1, 0}, - {SqlDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSql), 1, 0}, - {HttpReceiverDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSql), 1, 0}, - {PachubeDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createPachube), 1, 0}, - {SnmpDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSnmp), 1, 0}, - {PersistentDataSourceRT.class.getSimpleName(), wrap(() -> new PersistentDataSourceRT(new PersistentDataSourceVO())), 1, 0}, - {ModbusIpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, - {ModbusSerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, - - - {VirtualDataSourceRT.class.getSimpleName(), wrap(() -> new VirtualDataSourceRT(new VirtualDataSourceVO())), 0, 0}, - {ASCIIFileDataSource.class.getSimpleName(), wrap(() -> new ASCIIFileDataSource(new ASCIIFileDataSourceVO<>())), 0, 0}, - {HttpImageDataSourceRT.class.getSimpleName(), wrap(() -> new HttpImageDataSourceRT(new HttpImageDataSourceVO())), 0, 0}, - {HttpRetrieverDataSourceRT.class.getSimpleName(), wrap(() -> new HttpRetrieverDataSourceRT(new HttpRetrieverDataSourceVO())), 0, 0}, - {InternalDataSourceRT.class.getSimpleName(), wrap(() -> new InternalDataSourceRT(new InternalDataSourceVO())), 0, 0}, - {JmxDataSourceRT.class.getSimpleName(), wrap(() -> new JmxDataSourceRT(new JmxDataSourceVO())), 0, 0}, - {MBusDataSourceRT.class.getSimpleName(), wrap(() -> new MBusDataSourceRT(new MBusDataSourceVO())), 0, 0}, - {MetaDataSourceRT.class.getSimpleName(), wrap(() -> new MetaDataSourceRT(new MetaDataSourceVO())), 0, 0}, - {NodaveS7DataSource.class.getSimpleName(), wrap(() -> new NodaveS7DataSource(new NodaveS7DataSourceVO<>())), 0, 0}, - {OpenV4JDataSourceRT.class.getSimpleName(), wrap(() -> new OpenV4JDataSourceRT(new OpenV4JDataSourceVO())), 0, 0}, - {Pop3DataSourceRT.class.getSimpleName(), wrap(() -> new Pop3DataSourceRT(new Pop3DataSourceVO())), 0, 0}, + {ASCIISerialDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createAsciiSerial), 1, 0}, + {Alpha2DataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createAlpha2), 1, 0}, + {BACnetIPDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createBacNet), 3, 0}, + {Dnp3IpDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createDnp3Ip), 1, 0}, + {Dnp3SerialDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createDnp3Serial), 1, 0}, + {DrStorageHt5bDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createDrStorageMock), 1, 0}, + {EBI25DataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createEbi25), 1, 0}, + {NmeaDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createNmea), 1, 0}, + {RadiuinoEventDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createRadiuino), 1, 0}, + {RadiuinoPollingDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createRadiuinoPolling), 1, 0}, + {VMStatDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtTest::createVmStat), 1, 0}, + {ViconicsDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createViconics), 1, 0}, + {GalilDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createGalil), 1, 0}, + {IEC101EthernetDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createIec101Ethernet), 1, 0}, + {IEC101SerialDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createIec101Serial), 1, 0}, + {AmqpDataSourceVO.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createAmqp), 1, 0}, + {MqttDataSourceVO.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createMqtt), 1, 0}, + {ModbusIpDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, + {ModbusSerialDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, + {OPCDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createOpc), 1, 0}, + {OneWireDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createOneWire), 1, 0}, + {SqlDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createSql), 1, 0}, + {HttpReceiverDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createSql), 1, 0}, + {PachubeDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createPachube), 1, 0}, + {SnmpDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createSnmp), 1, 0}, + {PersistentDataSourceRT.class.getSimpleName(), supplier(() -> new PersistentDataSourceRT(new PersistentDataSourceVO())), 1, 0}, + {ModbusIpDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, + {ModbusSerialDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, + + + {VirtualDataSourceRT.class.getSimpleName(), supplier(() -> new VirtualDataSourceRT(new VirtualDataSourceVO())), 0, 0}, + {ASCIIFileDataSource.class.getSimpleName(), supplier(() -> new ASCIIFileDataSource(new ASCIIFileDataSourceVO<>())), 0, 0}, + {HttpImageDataSourceRT.class.getSimpleName(), supplier(() -> new HttpImageDataSourceRT(new HttpImageDataSourceVO())), 0, 0}, + {HttpRetrieverDataSourceRT.class.getSimpleName(), supplier(() -> new HttpRetrieverDataSourceRT(new HttpRetrieverDataSourceVO())), 0, 0}, + {InternalDataSourceRT.class.getSimpleName(), supplier(() -> new InternalDataSourceRT(new InternalDataSourceVO())), 0, 0}, + {JmxDataSourceRT.class.getSimpleName(), supplier(() -> new JmxDataSourceRT(new JmxDataSourceVO())), 0, 0}, + {MBusDataSourceRT.class.getSimpleName(), supplier(() -> new MBusDataSourceRT(new MBusDataSourceVO())), 0, 0}, + {MetaDataSourceRT.class.getSimpleName(), supplier(() -> new MetaDataSourceRT(new MetaDataSourceVO())), 0, 0}, + {NodaveS7DataSource.class.getSimpleName(), supplier(() -> new NodaveS7DataSource(new NodaveS7DataSourceVO<>())), 0, 0}, + {OpenV4JDataSourceRT.class.getSimpleName(), supplier(() -> new OpenV4JDataSourceRT(new OpenV4JDataSourceVO())), 0, 0}, + {Pop3DataSourceRT.class.getSimpleName(), supplier(() -> new Pop3DataSourceRT(new Pop3DataSourceVO())), 0, 0}, }; } @@ -148,7 +148,7 @@ public static Object[][] data() throws Exception { private final int returnToNormalTimes; private final Supplier mockConfig; - public InitializeDataSourceRtTest(String name, Supplier mockConfig, int raiseEventTimes, int returnToNormalTimes) { + public InitializeDataSourceRtTest(String name, Supplier mockConfig, int returnToNormalTimes, int raiseEventTimes) { this.raiseEventTimes = raiseEventTimes; this.returnToNormalTimes = returnToNormalTimes; this.mockConfig = mockConfig; @@ -205,7 +205,7 @@ public void when_invoke_initialize_then_invoke_returnToNormal_times() { dataSourceRT.initialize(); //then: - Mockito.verify(eventManager, times(raiseEventTimes)).returnToNormal(any(), anyLong()); + Mockito.verify(eventManager, times(returnToNormalTimes)).returnToNormal(any(), anyLong()); } @Test @@ -215,7 +215,7 @@ public void when_invoke_initialize_with_errors_then_invoke_raiseEvent_times() { dataSourceRT.initialize(); //then: - Mockito.verify(eventManager, times(returnToNormalTimes)).raiseEvent(any(), anyLong(), anyBoolean(), anyInt(), any(), anyMap()); + Mockito.verify(eventManager, times(raiseEventTimes)).raiseEvent(any(), anyLong(), anyBoolean(), anyInt(), any(), anyMap()); } public static DataSourceRT createVmStat() { diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java index cb8759df50..29bed5ffbc 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -72,7 +72,7 @@ import java.io.IOException; import java.util.function.Supplier; -import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.wrap; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.supplier; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -107,33 +107,33 @@ public static Object[][] data() { return new Object[][] { - {wrap(() -> new ASCIISerialDataSource(new ASCIISerialDataSourceVO<>())), ASCIISerialDataSource.class.getSimpleName()}, - {wrap(() -> new Alpha2DataSource(new Alpha2DataSourceVO<>())), Alpha2DataSource.class.getSimpleName()}, - {wrap(() -> new BACnetIPDataSourceRT(baCnetIPDataSourceVO)), BACnetIPDataSourceRT.class.getSimpleName()}, - {wrap(() -> new Dnp3IpDataSource(new Dnp3IpDataSourceVO())), Dnp3IpDataSource.class.getSimpleName()}, - {wrap(() -> new Dnp3SerialDataSource(new Dnp3SerialDataSourceVO())), Dnp3SerialDataSource.class.getSimpleName()}, - {wrap(() -> new DrStorageHt5bDataSource(new DrStorageHt5bDataSourceVO<>())), DrStorageHt5bDataSource.class.getSimpleName()}, - {wrap(() -> new EBI25DataSourceRT(new EBI25DataSourceVO())), EBI25DataSourceRT.class.getSimpleName()}, - {wrap(() -> new NmeaDataSourceRT(new NmeaDataSourceVO())), NmeaDataSourceRT.class.getSimpleName()}, - {wrap(() -> new RadiuinoEventDataSource(new RadiuinoDataSourceVO<>())), RadiuinoEventDataSource.class.getSimpleName()}, - {wrap(() -> new RadiuinoPollingDataSource(new RadiuinoDataSourceVO<>())), RadiuinoPollingDataSource.class.getSimpleName()}, - {wrap(() -> new VMStatDataSourceRT(new VMStatDataSourceVO())), VMStatDataSourceRT.class.getSimpleName()}, - {wrap(() -> new ViconicsDataSourceRT(new ViconicsDataSourceVO())), ViconicsDataSourceRT.class.getSimpleName()}, - {wrap(() -> new GalilDataSourceRT(new GalilDataSourceVO())), GalilDataSourceRT.class.getSimpleName()}, - {wrap(() -> new IEC101EthernetDataSource(new IEC101EthernetDataSourceVO())), IEC101EthernetDataSource.class.getSimpleName()}, - {wrap(() -> new IEC101SerialDataSource(new IEC101SerialDataSourceVO())), IEC101SerialDataSource.class.getSimpleName()}, - {wrap(() -> new MessagingDataSourceRT(amqpDataSourceVO, MessagingServiceFactory.newService(amqpDataSourceVO))), AmqpDataSourceVO.class.getSimpleName()}, - {wrap(() -> new MessagingDataSourceRT(mqttDataSourceVO, messageServiceMock)), MqttDataSourceVO.class.getSimpleName()}, - - {wrap(() -> new ModbusSerialDataSource(new ModbusSerialDataSourceVO())), ModbusSerialDataSource.class.getSimpleName()}, - {wrap(() -> new ModbusIpDataSource(modbusIpDataSourceVO)), ModbusIpDataSource.class.getSimpleName()}, - {wrap(() -> new OPCDataSource(new OPCDataSourceVO<>())), OPCDataSource.class.getSimpleName()}, - {wrap(() -> new OneWireDataSourceRT(new OneWireDataSourceVO())), OneWireDataSourceRT.class.getSimpleName()}, - {wrap(() -> new SqlDataSourceRT(new SqlDataSourceVO())), SqlDataSourceRT.class.getSimpleName()}, - {wrap(() -> new HttpReceiverDataSourceRT(new HttpReceiverDataSourceVO())), HttpReceiverDataSourceRT.class.getSimpleName()}, - {wrap(() -> new PachubeDataSourceRT(new PachubeDataSourceVO())), PachubeDataSourceRT.class.getSimpleName()}, - {wrap(() -> new SnmpDataSourceRT(new SnmpDataSourceVO())), SnmpDataSourceRT.class.getSimpleName()}, - {wrap(() -> new PersistentDataSourceRT(persistentDataSourceVO)), PersistentDataSourceRT.class.getSimpleName()}, + {supplier(() -> new ASCIISerialDataSource(new ASCIISerialDataSourceVO<>())), ASCIISerialDataSource.class.getSimpleName()}, + {supplier(() -> new Alpha2DataSource(new Alpha2DataSourceVO<>())), Alpha2DataSource.class.getSimpleName()}, + {supplier(() -> new BACnetIPDataSourceRT(baCnetIPDataSourceVO)), BACnetIPDataSourceRT.class.getSimpleName()}, + {supplier(() -> new Dnp3IpDataSource(new Dnp3IpDataSourceVO())), Dnp3IpDataSource.class.getSimpleName()}, + {supplier(() -> new Dnp3SerialDataSource(new Dnp3SerialDataSourceVO())), Dnp3SerialDataSource.class.getSimpleName()}, + {supplier(() -> new DrStorageHt5bDataSource(new DrStorageHt5bDataSourceVO<>())), DrStorageHt5bDataSource.class.getSimpleName()}, + {supplier(() -> new EBI25DataSourceRT(new EBI25DataSourceVO())), EBI25DataSourceRT.class.getSimpleName()}, + {supplier(() -> new NmeaDataSourceRT(new NmeaDataSourceVO())), NmeaDataSourceRT.class.getSimpleName()}, + {supplier(() -> new RadiuinoEventDataSource(new RadiuinoDataSourceVO<>())), RadiuinoEventDataSource.class.getSimpleName()}, + {supplier(() -> new RadiuinoPollingDataSource(new RadiuinoDataSourceVO<>())), RadiuinoPollingDataSource.class.getSimpleName()}, + {supplier(() -> new VMStatDataSourceRT(new VMStatDataSourceVO())), VMStatDataSourceRT.class.getSimpleName()}, + {supplier(() -> new ViconicsDataSourceRT(new ViconicsDataSourceVO())), ViconicsDataSourceRT.class.getSimpleName()}, + {supplier(() -> new GalilDataSourceRT(new GalilDataSourceVO())), GalilDataSourceRT.class.getSimpleName()}, + {supplier(() -> new IEC101EthernetDataSource(new IEC101EthernetDataSourceVO())), IEC101EthernetDataSource.class.getSimpleName()}, + {supplier(() -> new IEC101SerialDataSource(new IEC101SerialDataSourceVO())), IEC101SerialDataSource.class.getSimpleName()}, + {supplier(() -> new MessagingDataSourceRT(amqpDataSourceVO, MessagingServiceFactory.newService(amqpDataSourceVO))), AmqpDataSourceVO.class.getSimpleName()}, + {supplier(() -> new MessagingDataSourceRT(mqttDataSourceVO, messageServiceMock)), MqttDataSourceVO.class.getSimpleName()}, + + {supplier(() -> new ModbusSerialDataSource(new ModbusSerialDataSourceVO())), ModbusSerialDataSource.class.getSimpleName()}, + {supplier(() -> new ModbusIpDataSource(modbusIpDataSourceVO)), ModbusIpDataSource.class.getSimpleName()}, + {supplier(() -> new OPCDataSource(new OPCDataSourceVO<>())), OPCDataSource.class.getSimpleName()}, + {supplier(() -> new OneWireDataSourceRT(new OneWireDataSourceVO())), OneWireDataSourceRT.class.getSimpleName()}, + {supplier(() -> new SqlDataSourceRT(new SqlDataSourceVO())), SqlDataSourceRT.class.getSimpleName()}, + {supplier(() -> new HttpReceiverDataSourceRT(new HttpReceiverDataSourceVO())), HttpReceiverDataSourceRT.class.getSimpleName()}, + {supplier(() -> new PachubeDataSourceRT(new PachubeDataSourceVO())), PachubeDataSourceRT.class.getSimpleName()}, + {supplier(() -> new SnmpDataSourceRT(new SnmpDataSourceVO())), SnmpDataSourceRT.class.getSimpleName()}, + {supplier(() -> new PersistentDataSourceRT(persistentDataSourceVO)), PersistentDataSourceRT.class.getSimpleName()}, }; } diff --git a/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java b/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java index 227b38bb04..c3b011cebc 100644 --- a/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java +++ b/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java @@ -29,11 +29,12 @@ import com.serotonin.bacnet4j.event.DeviceEventHandler; import com.serotonin.mango.Common; import com.serotonin.mango.rt.dataImage.DataPointRT; -import com.serotonin.mango.rt.dataSource.DataSourceRT; import com.serotonin.mango.rt.dataSource.bacnet.BACnetIPDataSourceRT; import com.serotonin.mango.rt.dataSource.ebro.EBI25Constants; import com.serotonin.mango.rt.dataSource.ebro.EBI25DataSourceRT; import com.serotonin.mango.rt.dataSource.galil.GalilDataSourceRT; +import com.serotonin.mango.rt.dataSource.galil.GalilRequest; +import com.serotonin.mango.rt.dataSource.galil.GalilResponse; import com.serotonin.mango.rt.dataSource.modbus.ModbusDataSource; import com.serotonin.mango.rt.dataSource.modbus.ModbusIpDataSource; import com.serotonin.mango.rt.dataSource.modbus.ModbusSerialDataSource; @@ -46,6 +47,8 @@ import com.serotonin.mango.rt.dataSource.sql.SqlDataSourceRT; import com.serotonin.mango.rt.dataSource.viconics.ViconicsDataSourceRT; import com.serotonin.mango.util.timeout.TimeoutTask; +import com.serotonin.mango.vo.DataPointVO; +import com.serotonin.mango.vo.dataSource.DataSourceVO; import com.serotonin.mango.vo.dataSource.bacnet.BACnetIPDataSourceVO; import com.serotonin.mango.vo.dataSource.ebro.EBI25DataSourceVO; import com.serotonin.mango.vo.dataSource.galil.GalilDataSourceVO; @@ -57,6 +60,8 @@ import com.serotonin.mango.vo.dataSource.snmp.SnmpDataSourceVO; import com.serotonin.mango.vo.dataSource.sql.SqlDataSourceVO; import com.serotonin.mango.vo.dataSource.viconics.ViconicsDataSourceVO; +import com.serotonin.messaging.MessageControl; +import com.serotonin.messaging.StreamTransport; import com.serotonin.modbus4j.ModbusMaster; import com.serotonin.modbus4j.exception.ModbusInitException; import com.serotonin.modbus4j.ip.tcp.TcpMaster; @@ -80,6 +85,8 @@ import java.io.OutputStream; import java.net.Socket; import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoints; @@ -236,23 +243,31 @@ public static GalilDataSourceRT createGalil() { return dataSource; } - public static Supplier wrap(Supplier function) { + public static Consumer consumer(Consumer consumer) { + return consumer; + } + + public static Supplier supplier(Supplier function) { return function; } - public static void reset(List list1, List list2, List list3) { + public static > Function function(Function function) { + return function; + } + + public static void resetUnreliable(List list1, List list2, List list3) { resetUnreliableDataPoints(list1); resetUnreliableDataPoints(list2); resetUnreliableDataPoints(list3); } - public static void set(List list1, List list2, List list3) { + public static void setUnreliable(List list1, List list2, List list3) { setUnreliableDataPoints(list1); setUnreliableDataPoints(list2); setUnreliableDataPoints(list3); } - private static void sqlMock(SqlDataSourceRT dataSource) { + public static void sqlMock(SqlDataSourceRT dataSource) { mockStatic(SqlDataSourceUtils.class); JdbcOperations jdbcOperations = mock(JdbcOperations.class); when(jdbcOperations.queryForObject(anyString(), eq(int.class))).thenReturn(1); @@ -264,7 +279,7 @@ private static void sqlMock(SqlDataSourceRT dataSource) { } } - private static void oneWireMock(OneWireDataSourceRT dataSource) { + public static void oneWireMock(OneWireDataSourceRT dataSource) { Network networkMock = mock(Network.class); try { whenNew(Network.class).withAnyArguments() @@ -274,7 +289,7 @@ private static void oneWireMock(OneWireDataSourceRT dataSource) { } } - private static void opcMock(OPCDataSource dataSource) { + public static void opcMock(OPCDataSource dataSource) { RealOPCMaster realOPCMasterMock = mock(RealOPCMaster.class); try { whenNew(RealOPCMaster.class).withAnyArguments() @@ -300,7 +315,7 @@ public static void modbusMock(ModbusDataSource dataSource) { } } - private static void iec101Mock(IEC101DataSource dataSource) { + public static void iec101Mock(IEC101DataSource dataSource) { IEC101Master iec101MasterMock = mock(IEC101Master.class); try { whenNew(IEC101Master.class).withAnyArguments() @@ -310,12 +325,25 @@ private static void iec101Mock(IEC101DataSource dataSource) { } } - private static void galilMock(GalilDataSourceRT dataSource) { + public static void galilMock(GalilDataSourceRT dataSource) { InputStream inputStreamMock = mock(InputStream.class); OutputStream outputStreamMock = mock(OutputStream.class); Socket socketMock = mock(Socket.class); + MessageControl messageControlMock = mock(MessageControl.class); + try { + when(messageControlMock.send(any(GalilRequest.class))) + .thenReturn(new GalilResponse(new byte[]{})); + } catch (IOException e) { + throw new RuntimeException(e); + } + + StreamTransport streamTransportMock = mock(StreamTransport.class); + doAnswer(a -> { + return null; + }).when(streamTransportMock).start(anyString()); + try { doAnswer(a -> { return null; @@ -326,12 +354,18 @@ private static void galilMock(GalilDataSourceRT dataSource) { whenNew(Socket.class).withAnyArguments() .thenReturn(socketMock); + + whenNew(MessageControl.class).withAnyArguments() + .thenReturn(messageControlMock); + + whenNew(StreamTransport.class).withAnyArguments() + .thenReturn(streamTransportMock); } catch (Exception e) { throw new RuntimeException(e); } } - private static void viconicsMock(ViconicsDataSourceRT dataSource) { + public static void viconicsMock(ViconicsDataSourceRT dataSource) { ViconicsNetwork viconicsNetworkMock = mock(ViconicsNetwork.class); try { whenNew(ViconicsNetwork.class).withAnyArguments() @@ -341,7 +375,7 @@ private static void viconicsMock(ViconicsDataSourceRT dataSource) { } } - private static void nmeaMock(NmeaDataSourceRT dataSource) { + public static void nmeaMock(NmeaDataSourceRT dataSource) { NmeaReceiver nmeaReceiverMock = mock(NmeaReceiver.class); TimeoutTask timeoutTaskMock = mock(TimeoutTask.class); try { @@ -354,7 +388,7 @@ private static void nmeaMock(NmeaDataSourceRT dataSource) { } } - private static void ebi25Mock(EBI25DataSourceRT dataSource) { + public static void ebi25Mock(EBI25DataSourceRT dataSource) { ModbusMaster modbusMasterMock = mock(ModbusMaster.class); mockStatic(EBI25Constants.class); try { @@ -365,7 +399,7 @@ private static void ebi25Mock(EBI25DataSourceRT dataSource) { } } - private static void alpha2Mock(Alpha2DataSource dataSource) { + public static void alpha2Mock(Alpha2DataSource dataSource) { Alpha2Master alpha2MasterMock = mock(Alpha2Master.class); try { doAnswer(invocation -> { @@ -379,7 +413,7 @@ private static void alpha2Mock(Alpha2DataSource dataSource) { } } - private static void dnp3Mock(Dnp3DataSource dataSource) { + public static void dnp3Mock(Dnp3DataSource dataSource) { DNP3Master dnp3MasterMock = mock(DNP3Master.class); try { whenNew(DNP3Master.class) @@ -390,7 +424,7 @@ private static void dnp3Mock(Dnp3DataSource dataSource) { } } - private static void bacNetMock(BACnetIPDataSourceRT dataSource) { + public static void bacNetMock(BACnetIPDataSourceRT dataSource) { LocalDevice localDeviceMock = mock(LocalDevice.class); DeviceEventHandler deviceEventHandlerMock = mock(DeviceEventHandler.class); @@ -406,29 +440,29 @@ private static void bacNetMock(BACnetIPDataSourceRT dataSource) { } } - private static void pachubeMock(PachubeDataSourceRT dataSource) { + public static void pachubeMock(PachubeDataSourceRT dataSource) { HttpClient httpClient = mock(HttpClient.class); when(httpClient.getParams()).thenReturn(new HttpClientParams()); mockStatic(Common.class); when(Common.getHttpClient(anyInt())).thenReturn(httpClient); } - private static void asciiSerialMock(ASCIISerialDataSource dataSource) { + public static void asciiSerialMock(ASCIISerialDataSource dataSource) { SerialPort serialPortMock = mock(SerialPort.class); dataSource.setsPort(serialPortMock); } - private static void radiuinoMock(RadiuinoEventDataSource dataSource) { + public static void radiuinoMock(RadiuinoEventDataSource dataSource) { SerialPort serialPortMock = mock(SerialPort.class); dataSource.setsPort(serialPortMock); } - private static void radiuinoPollingMock(RadiuinoPollingDataSource dataSource) { + public static void radiuinoPollingMock(RadiuinoPollingDataSource dataSource) { SerialPort serialPortMock = mock(SerialPort.class); dataSource.setsPort(serialPortMock); } - private static void drStorageMock(DrStorageHt5bDataSource dataSource) { + public static void drStorageMock(DrStorageHt5bDataSource dataSource) { SerialPort serialPortMock = mock(SerialPort.class); dataSource.setsPort(serialPortMock); InputStream inputStreamMock = mock(InputStream.class); From 1690c7cda3cf85d3d734a78b8292d2f6da47a824 Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Wed, 28 Feb 2024 11:09:04 +0100 Subject: [PATCH 12/63] #2755 Signaling the data source that has a problem: - added class: RuntimeMockUtils --- test/utils/mock/RuntimeMockUtils.java | 61 +++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 test/utils/mock/RuntimeMockUtils.java diff --git a/test/utils/mock/RuntimeMockUtils.java b/test/utils/mock/RuntimeMockUtils.java new file mode 100644 index 0000000000..347a4e6c5f --- /dev/null +++ b/test/utils/mock/RuntimeMockUtils.java @@ -0,0 +1,61 @@ +package utils.mock; + +import com.serotonin.mango.Common; +import com.serotonin.mango.rt.EventManager; +import com.serotonin.mango.rt.RuntimeManager; +import com.serotonin.mango.rt.maint.BackgroundProcessing; +import com.serotonin.mango.web.ContextWrapper; +import org.powermock.api.mockito.PowerMockito; +import org.scada_lts.dao.SystemSettingsDAO; +import org.scada_lts.mango.service.DataPointService; +import org.scada_lts.mango.service.DataSourceService; +import org.scada_lts.mango.service.PointValueService; +import org.scada_lts.mango.service.SystemSettingsService; +import org.scada_lts.web.beans.ApplicationBeans; +import org.scada_lts.web.ws.services.DataPointServiceWebSocket; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.powermock.api.mockito.PowerMockito.*; +import static org.powermock.api.mockito.PowerMockito.when; + +public final class RuntimeMockUtils { + + private RuntimeMockUtils() {} + + public static void runtimeManagerMock(RuntimeManager runtimeManager, EventManager eventManager) throws Exception { + + DataSourceService dataSourceService = PowerMockito.mock(DataSourceService.class); + whenNew(DataSourceService.class).withNoArguments().thenReturn(dataSourceService); + + DataPointService dataPointService = PowerMockito.mock(DataPointService.class); + whenNew(DataPointService.class).withNoArguments().thenReturn(dataPointService); + + SystemSettingsService systemSettingsService = PowerMockito.mock(SystemSettingsService.class); + whenNew(SystemSettingsService.class).withNoArguments().thenReturn(systemSettingsService); + + SystemSettingsDAO systemSettingsDAO = PowerMockito.mock(SystemSettingsDAO.class); + whenNew(SystemSettingsDAO.class).withNoArguments().thenReturn(systemSettingsDAO); + + mockStatic(SystemSettingsDAO.class); + when(SystemSettingsDAO.getValue(anyString())).thenReturn(""); + when(SystemSettingsDAO.getFutureDateLimit()).thenReturn(1L); + + PointValueService mangoPointValues = PowerMockito.mock(PointValueService.class); + whenNew(PointValueService.class).withNoArguments().thenReturn(mangoPointValues); + + mockStatic(ApplicationBeans.class); + DataPointServiceWebSocket dataPointServiceWebSocket = PowerMockito.mock(DataPointServiceWebSocket.class); + when(ApplicationBeans.getDataPointServiceWebSocketBean()).thenReturn(dataPointServiceWebSocket); + + ContextWrapper contextWrapper = PowerMockito.mock(ContextWrapper.class); + BackgroundProcessing backgroundProcessing = PowerMockito.mock(BackgroundProcessing.class); + + when(contextWrapper.getRuntimeManager()).thenReturn(runtimeManager); + when(contextWrapper.getEventManager()).thenReturn(eventManager); + when(contextWrapper.getBackgroundProcessing()).thenReturn(backgroundProcessing); + + Common.ctx = contextWrapper; + Common.timer.init(); + + } +} From e5884bfc073071b013fe6c6b4bb81157af5acfce Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Wed, 28 Feb 2024 11:46:57 +0100 Subject: [PATCH 13/63] #2755 Signaling the data source that has a problem: - fixed generate many events by: Pop3DataSourceRT, PachubeDataSourceRT, NmeaDataSourceRT, HttpRetrieverDataSourceRT, BACnetIPDataSourceRT, change to active events; - change logging fatal to debug level in methods: MBusDataSourceRT.initialize(), MBusDataSourceRT.terminate(); - fixed DataPointUnreliableUtilsTest, InitializeDataSourceRtTest, InitializeWithErrorsDataSourceRtTest, mocking TimeoutTask; --- .../dataSource/bacnet/BACnetIPDataSourceRT.java | 6 +++--- .../http/HttpRetrieverDataSourceRT.java | 2 +- .../rt/dataSource/mbus/MBusDataSourceRT.java | 4 ++-- .../rt/dataSource/nmea/NmeaDataSourceRT.java | 4 +++- .../dataSource/pachube/PachubeDataSourceRT.java | 2 +- .../rt/dataSource/pop3/Pop3DataSourceRT.java | 16 +++++++++------- .../dataSource/DataPointUnreliableUtilsTest.java | 2 +- .../dataSource/InitializeDataSourceRtTest.java | 7 +++++-- .../InitializeWithErrorsDataSourceRtTest.java | 13 ++++++++++++- test/utils/mock/RuntimeMockUtils.java | 5 +++++ 10 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java index db191de006..c7d156fc65 100644 --- a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java @@ -674,15 +674,15 @@ private void fireMessageExceptionEvent(Throwable t) { } private void fireMessageExceptionEvent(String key, String... args) { - raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, (Object[]) args)); + raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage(key, (Object[]) args)); } private void fireMessageExceptionEvent(DataPointRT dataPointRT, String key, String... args) { - raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, (Object[]) args), dataPointRT); + raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage(key, (Object[]) args), dataPointRT); } private void fireDeviceExceptionEvent(DataPointRT dataPointRT, String key, String... args) { - raiseEvent(DEVICE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, (Object[]) args), dataPointRT); + raiseEvent(DEVICE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage(key, (Object[]) args), dataPointRT); } private void returnToNormal() { diff --git a/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java index 556a8ad05a..50ac0ebed0 100644 --- a/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java @@ -125,7 +125,7 @@ protected void doPoll(long time) { } if (parseErrorMessage != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseErrorMessage); + raiseEvent(PARSE_EXCEPTION_EVENT, time, true, parseErrorMessage); else returnToNormal(PARSE_EXCEPTION_EVENT, time); } diff --git a/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java index b6d687fed2..72e673ab08 100644 --- a/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java @@ -61,13 +61,13 @@ public MBusDataSourceRT(MBusDataSourceVO vo) { @Override public void initialize() { - LOG.fatal("INITIALIZE MBusaDataSourceRT" + Thread.getAllStackTraces().get(Thread.currentThread())); + LOG.debug("INITIALIZE MBusaDataSourceRT" + Thread.getAllStackTraces().get(Thread.currentThread())); super.initialize(); } @Override public void terminate() { - LOG.fatal("TERMINATE MBusaDataSourceRT" + Thread.getAllStackTraces().get(Thread.currentThread())); + LOG.debug("TERMINATE MBusaDataSourceRT" + Thread.getAllStackTraces().get(Thread.currentThread())); super.terminate(); } diff --git a/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java index 1a958bd4c1..b48c6247ae 100644 --- a/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java @@ -135,7 +135,9 @@ public void receivedMessage(NmeaMessage message) { } if (parseError != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseError); + raiseEvent(PARSE_EXCEPTION_EVENT, time, true, parseError); + else + returnToNormal(PARSE_EXCEPTION_EVENT, time); } private void receivedMessageImpl(DataPointRT dp, NmeaMessage message, long time) throws Exception { diff --git a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java index 0f4e8f16e3..140ca7cce5 100644 --- a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java @@ -212,7 +212,7 @@ protected void pollFeed(int feedId, List points, long time) { } if (parseErrorMessage != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseErrorMessage); + raiseEvent(PARSE_EXCEPTION_EVENT, time, true, parseErrorMessage); else returnToNormal(PARSE_EXCEPTION_EVENT, time); } diff --git a/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java index 92a79326b9..99d30e1292 100644 --- a/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java @@ -123,19 +123,21 @@ protected void doPoll(long time) { returnToNormal(INBOX_EXCEPTION_EVENT, time); if (messagesRead) { - if (messageReadError != null) - raiseEvent(MESSAGE_READ_EXCEPTION_EVENT, time, false, messageReadError); - else + if (messageReadError != null) { + raiseEvent(MESSAGE_READ_EXCEPTION_EVENT, time, true, messageReadError); + return; + } else returnToNormal(MESSAGE_READ_EXCEPTION_EVENT, time); - if (parseError != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseError); - else + if (parseError != null) { + raiseEvent(PARSE_EXCEPTION_EVENT, time, true, parseError); + return; + } else returnToNormal(PARSE_EXCEPTION_EVENT, time); } } catch (Exception e) { - raiseEvent(INBOX_EXCEPTION_EVENT, time, false, new LocalizableMessage("common.default", e.getMessage())); + raiseEvent(INBOX_EXCEPTION_EVENT, time, true, new LocalizableMessage("common.default", e.getMessage())); } finally { try { diff --git a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java index 4cdb810e19..167ebcd17a 100644 --- a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java +++ b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java @@ -42,7 +42,7 @@ @RunWith(PowerMockRunner.class) @PrepareForTest({WebContextFactory.class, Common.class, MiscDwr.class, SystemSettingsDAO.class, ContentGenerator.class, PointValueCache.class, DataPointRT.class, RuntimeManager.class, DataPointDao.class, - PointValueDao.class, ApplicationBeans.class}) + PointValueDao.class, ApplicationBeans.class, PollingDataSource.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class DataPointUnreliableUtilsTest { diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java index 2be4d05b89..1c004ab372 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java @@ -41,6 +41,7 @@ import com.serotonin.mango.rt.dataSource.vmstat.VMStatDataSourceRT; import com.serotonin.mango.util.InitializeDataSourceRtMockUtils; import com.serotonin.mango.util.SqlDataSourceUtils; +import com.serotonin.mango.util.timeout.TimeoutTask; import com.serotonin.mango.vo.dataSource.http.HttpImageDataSourceVO; import com.serotonin.mango.vo.dataSource.http.HttpRetrieverDataSourceVO; import com.serotonin.mango.vo.dataSource.internal.InternalDataSourceVO; @@ -80,6 +81,8 @@ import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.supplier; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.powermock.api.mockito.PowerMockito.mock; +import static org.powermock.api.mockito.PowerMockito.whenNew; @RunWith(PowerMockRunner.class) @@ -88,7 +91,7 @@ Alpha2Master.class, BACnetIPDataSourceRT.class, Dnp3IpDataSource.class, Dnp3SerialDataSource.class, EBI25DataSourceRT.class, EBI25Constants.class, NmeaDataSourceRT.class, Runtime.class, VMStatDataSourceRT.class, ViconicsDataSourceRT.class, GalilDataSourceRT.class, IEC101EthernetDataSource.class, IEC101SerialDataSource.class, - ModbusFactory.class, OPCDataSource.class, OneWireDataSourceRT.class, SqlDataSourceUtils.class}) + ModbusFactory.class, OPCDataSource.class, OneWireDataSourceRT.class, SqlDataSourceUtils.class, PollingDataSource.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class InitializeDataSourceRtTest { @@ -157,7 +160,7 @@ public InitializeDataSourceRtTest(String name, Supplier mockConfig, int retur private EventManager eventManager; @Before - public void config() throws Exception { + public void config() { eventManager = mock(EventManager.class); HttpReceiverMulticaster multicastListener = mock(HttpReceiverMulticaster.class); diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java index 29bed5ffbc..39c6746c53 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -35,6 +35,7 @@ import com.serotonin.mango.rt.dataSource.sql.SqlDataSourceRT; import com.serotonin.mango.rt.dataSource.viconics.ViconicsDataSourceRT; import com.serotonin.mango.rt.dataSource.vmstat.VMStatDataSourceRT; +import com.serotonin.mango.util.timeout.TimeoutTask; import com.serotonin.mango.vo.dataSource.bacnet.BACnetIPDataSourceVO; import com.serotonin.mango.vo.dataSource.ebro.EBI25DataSourceVO; import com.serotonin.mango.vo.dataSource.galil.GalilDataSourceVO; @@ -75,11 +76,13 @@ import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.supplier; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.powermock.api.mockito.PowerMockito.mock; +import static org.powermock.api.mockito.PowerMockito.whenNew; @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(Parameterized.class) -@PrepareForTest({Common.class, Runtime.class, VMStatDataSourceRT.class}) +@PrepareForTest({Common.class, Runtime.class, VMStatDataSourceRT.class, PollingDataSource.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class InitializeWithErrorsDataSourceRtTest { @@ -164,6 +167,14 @@ public void config() { dataSourceRT1.initialize(); } + TimeoutTask timeoutTaskMock = mock(TimeoutTask.class); + try { + whenNew(TimeoutTask.class).withAnyArguments() + .thenReturn(timeoutTaskMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + reset(eventManager); if(dataSourceRT instanceof VMStatDataSourceRT) { diff --git a/test/utils/mock/RuntimeMockUtils.java b/test/utils/mock/RuntimeMockUtils.java index 347a4e6c5f..6fd56c22d4 100644 --- a/test/utils/mock/RuntimeMockUtils.java +++ b/test/utils/mock/RuntimeMockUtils.java @@ -4,6 +4,7 @@ import com.serotonin.mango.rt.EventManager; import com.serotonin.mango.rt.RuntimeManager; import com.serotonin.mango.rt.maint.BackgroundProcessing; +import com.serotonin.mango.util.timeout.TimeoutTask; import com.serotonin.mango.web.ContextWrapper; import org.powermock.api.mockito.PowerMockito; import org.scada_lts.dao.SystemSettingsDAO; @@ -54,6 +55,10 @@ public static void runtimeManagerMock(RuntimeManager runtimeManager, EventManage when(contextWrapper.getEventManager()).thenReturn(eventManager); when(contextWrapper.getBackgroundProcessing()).thenReturn(backgroundProcessing); + TimeoutTask timeoutTaskMock = mock(TimeoutTask.class); + whenNew(TimeoutTask.class).withAnyArguments() + .thenReturn(timeoutTaskMock); + Common.ctx = contextWrapper; Common.timer.init(); From b23f32047957309151305add6c09253355636ea7 Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Wed, 21 Feb 2024 21:22:40 +0100 Subject: [PATCH 14/63] #2755 Signaling the data source that has a problem: - corrected terminate method for: Alpha2DataSource, Dnp3DataSource, DrStorageHt5bDataSource, IEC101DataSource, OPCDataSource, RadiuinoEventDataSource, RadiuinoPollingDataSource; - fixed reset unreliable HttpImageDataSourceRT when error retriever; - refactor DataPointUnreliableUtils; - fixed RuntimeManager.startDataPoint; --- .../dataSource/alpha2/Alpha2DataSource.java | 11 ++++--- .../rt/dataSource/dnp3/Dnp3DataSource.java | 3 +- .../DrStorageHt5bDataSource.java | 4 ++- .../dataSource/iec101/IEC101DataSource.java | 5 ++- .../rt/dataSource/opc/OPCDataSource.java | 5 ++- .../radiuino/RadiuinoEventDataSource.java | 11 ++++++- .../radiuino/RadiuinoPollingDataSource.java | 11 ++++++- .../serotonin/mango/rt/RuntimeManager.java | 4 +-- .../dataSource/DataPointUnreliableUtils.java | 31 +++++++------------ .../http/HttpImageDataSourceRT.java | 6 ++-- webapp-resources/messages_de.properties | 3 +- webapp-resources/messages_en.properties | 3 +- webapp-resources/messages_es.properties | 3 +- webapp-resources/messages_fi.properties | 3 +- webapp-resources/messages_fr.properties | 3 +- webapp-resources/messages_lu.properties | 3 +- webapp-resources/messages_nl.properties | 3 +- webapp-resources/messages_pl.properties | 3 +- webapp-resources/messages_pt.properties | 3 +- webapp-resources/messages_ru.properties | 3 +- webapp-resources/messages_zh.properties | 3 +- 21 files changed, 79 insertions(+), 45 deletions(-) diff --git a/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java b/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java index 7b20b0553d..6e92af5a81 100644 --- a/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/alpha2/Alpha2DataSource.java @@ -140,7 +140,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, master.write(devices); returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } - } catch (Exception e) { + } catch (Throwable e) { treatException(POINT_WRITE_EXCEPTION_EVENT, e, System.currentTimeMillis(), dataPoint); } @@ -161,7 +161,7 @@ public void initialize() { master.init(); master.lineCheck(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { + } catch (Throwable e) { treatException(DATA_SOURCE_EXCEPTION_EVENT, e, System .currentTimeMillis()); return; @@ -174,7 +174,8 @@ public void initialize() { public void terminate() { super.terminate(); try { - master.terminate(); + if(master != null) + master.terminate(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this), e); @@ -184,7 +185,7 @@ public void terminate() { } } - private void treatException(int exceptionType, Exception e, long time) { + private void treatException(int exceptionType, Throwable e, long time) { LOG.warn(LoggingUtils.info(e, this), e); if (e instanceof COMMException) { raiseEvent(exceptionType, time, true, new LocalizableMessage( @@ -203,7 +204,7 @@ private void treatException(int exceptionType, Exception e, long time) { } } - private void treatException(int exceptionType, Exception e, long time, DataPointRT dataPointRT) { + private void treatException(int exceptionType, Throwable e, long time, DataPointRT dataPointRT) { LOG.warn(LoggingUtils.info(e, this), e); if (e instanceof COMMException) { raiseEvent(exceptionType, time, true, new LocalizableMessage( diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java index 046da47c4c..664a9b21e1 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java @@ -83,7 +83,8 @@ protected void initialize(DNP3Master dnp3Master) { public void terminate() { super.terminate(); try { - dnp3Master.terminate(); + if(dnp3Master != null) + dnp3Master.terminate(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this), e); diff --git a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java index 2ca2bb357d..5c56b471bb 100644 --- a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java @@ -120,7 +120,9 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, public void terminate() { super.terminate(); try { - getsPort().close(); + SerialPort serialPort = getsPort(); + if(serialPort != null) + serialPort.close(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, diff --git a/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java b/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java index d107941319..73d6cc0578 100644 --- a/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/iec101/IEC101DataSource.java @@ -39,6 +39,8 @@ public IEC101DataSource(IEC101DataSourceVO vo) { @Override protected void doPoll(long time) { try { + if(iec101Master == null) + throw new IllegalStateException("Data source is not initialized!"); iec101Master.doPoll(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Exception e) { @@ -138,7 +140,8 @@ protected void initialize(IEC101Master iec101Master) { public void terminate() { super.terminate(); try { - iec101Master.terminate(); + if(iec101Master != null) + iec101Master.terminate(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this), e); diff --git a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java index 504d750532..f46c395c80 100644 --- a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java @@ -113,6 +113,7 @@ else if (dataPoint.getDataTypeId() == DataTypes.MULTISTATE) try { opcMaster.write(tag, value); + returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this, dataPoint), e); raiseEvent( @@ -158,7 +159,9 @@ public void initialize() { public void terminate() { super.terminate(); try { - opcMaster.terminate(); + if(opcMaster != null) + opcMaster.terminate(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { String message = e.getMessage(); if(e instanceof NullPointerException) { diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java index c08f2fd3e3..7fca33b1f8 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java @@ -97,7 +97,16 @@ public void initialize() { @Override public void terminate() { super.terminate(); - getsPort().close(); + try { + SerialPort serialPort = getsPort(); + if(serialPort != null) + serialPort.close(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + } LOG.debug("Terminando o Radiuino Polling Data Source."); } diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java index 15ded1b269..90807c0e9d 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java @@ -175,7 +175,16 @@ public void initialize() { @Override public void terminate() { super.terminate(); - getsPort().close(); + try { + SerialPort serialPort = getsPort(); + if(serialPort != null) + serialPort.close(); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + } LOG.debug("Terminando o Radiuino Polling Data Source."); } diff --git a/src/com/serotonin/mango/rt/RuntimeManager.java b/src/com/serotonin/mango/rt/RuntimeManager.java index b58f1e36b3..41598f8b52 100644 --- a/src/com/serotonin/mango/rt/RuntimeManager.java +++ b/src/com/serotonin/mango/rt/RuntimeManager.java @@ -491,10 +491,10 @@ private void startDataPoint(DataPointVO vo) { // Add/update it in the data source. ds.addDataPoint(dataPoint); - boolean reliable = isReliable(dataPoint); + boolean reliable = isReliable(dataPoint, ds); if(reliable) resetUnreliableDataPoint(dataPoint); - else if(!ds.isInitialized()) + else setUnreliableDataPoint(dataPoint); LOG.info("Data point '" + vo.getExtendedName() + "' initialized - reliable: " + reliable); diff --git a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java index 0817818ada..7449fb067b 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java +++ b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java @@ -7,7 +7,6 @@ import java.util.Collections; import java.util.List; -import java.util.function.*; import java.util.stream.Collectors; public final class DataPointUnreliableUtils { @@ -18,38 +17,36 @@ public final class DataPointUnreliableUtils { private DataPointUnreliableUtils() {} + public static boolean isReliable(DataPointRT dataPoint, DataSourceRT dataSource) { + return dataSource.isInitialized() && (!isSetUnreliable(dataPoint, true) || isSetUnreliable(dataPoint, false)); + } public static void setUnreliableDataPoints(List dataPoints) { - unreliable(dataPoints, DataPointUnreliableUtils::setAttributes, - Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, true, 9); + unreliable(dataPoints, true, 9); } public static void setUnreliableDataPoint(DataPointRT dataPoint) { - unreliable(Collections.singletonList(dataPoint), DataPointUnreliableUtils::setAttributes, - Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, true, 9); + unreliable(Collections.singletonList(dataPoint), true, 9); } public static void resetUnreliableDataPoints(List dataPoints) { - unreliable(dataPoints, DataPointUnreliableUtils::setAttributes, - Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, false, 9); + unreliable(dataPoints, false, 9); } public static void resetUnreliableDataPoint(DataPointRT dataPoint) { - unreliable(Collections.singletonList(dataPoint), DataPointUnreliableUtils::setAttributes, - Common.ctx.getRuntimeManager()::getRunningMetaDataPoints, false, 9); + unreliable(Collections.singletonList(dataPoint), false, 9); } - private static void unreliable(List dataPoints, BiConsumer, Boolean> setList, - IntFunction> getData, boolean unreliable, int safe) { - setList.accept(filter(dataPoints, unreliable), unreliable); + private static void unreliable(List dataPoints, boolean unreliable, int safe) { + setAttributes(filter(dataPoints, unreliable), unreliable); for(DataPointRT dataPoint: dataPoints) { - List metaDataPoints = getData.apply(dataPoint.getId()); + List metaDataPoints = Common.ctx.getRuntimeManager().getRunningMetaDataPoints(dataPoint.getId()); if(!metaDataPoints.isEmpty()) { if(safe > -1) - unreliable(metaDataPoints, setList, getData, unreliable, --safe); + unreliable(metaDataPoints, unreliable, --safe); else { LOG.warn("The safe counter has been exceeded!"); - setList.accept(filter(metaDataPoints, unreliable), unreliable); + setAttributes(filter(metaDataPoints, unreliable), unreliable); } } } @@ -70,8 +67,4 @@ private static boolean isSetUnreliable(DataPointRT dataPoint, boolean unreliable return dataPoint.getAttribute(ATTR_UNRELIABLE_KEY) != null && ((boolean) dataPoint.getAttribute(ATTR_UNRELIABLE_KEY)) == unreliable; } - - public static boolean isReliable(DataPointRT dataPoint) { - return !isSetUnreliable(dataPoint, true) || isSetUnreliable(dataPoint, false); - } } \ No newline at end of file diff --git a/src/com/serotonin/mango/rt/dataSource/http/HttpImageDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/http/HttpImageDataSourceRT.java index 89468b4d9b..bf76802ea4 100644 --- a/src/com/serotonin/mango/rt/dataSource/http/HttpImageDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/http/HttpImageDataSourceRT.java @@ -90,10 +90,12 @@ protected void doPoll(long time) { } // Check the results. - if (monitor.getRetrievalFailure() != null) + if (monitor.getRetrievalFailure() != null) { raiseEvent(DATA_RETRIEVAL_FAILURE_EVENT, time, true, monitor.getRetrievalFailure()); - else + return; + } else { returnToNormal(DATA_RETRIEVAL_FAILURE_EVENT, time); + } if (monitor.getSaveFailure() != null) raiseEvent(FILE_SAVE_EXCEPTION_EVENT, time, true, monitor.getSaveFailure()); diff --git a/webapp-resources/messages_de.properties b/webapp-resources/messages_de.properties index 46141027d5..5f0f20fccf 100644 --- a/webapp-resources/messages_de.properties +++ b/webapp-resources/messages_de.properties @@ -3335,4 +3335,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_en.properties b/webapp-resources/messages_en.properties index 1e1987cf0b..61da0f7764 100644 --- a/webapp-resources/messages_en.properties +++ b/webapp-resources/messages_en.properties @@ -3338,4 +3338,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_es.properties b/webapp-resources/messages_es.properties index ff6551e0bc..0468e96676 100644 --- a/webapp-resources/messages_es.properties +++ b/webapp-resources/messages_es.properties @@ -3378,4 +3378,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_fi.properties b/webapp-resources/messages_fi.properties index 8f3327f2da..586b18cdf3 100644 --- a/webapp-resources/messages_fi.properties +++ b/webapp-resources/messages_fi.properties @@ -3464,4 +3464,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_fr.properties b/webapp-resources/messages_fr.properties index 31090fc6e8..98145f908b 100644 --- a/webapp-resources/messages_fr.properties +++ b/webapp-resources/messages_fr.properties @@ -3332,4 +3332,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_lu.properties b/webapp-resources/messages_lu.properties index 64ad6c32d1..e2d67d6290 100644 --- a/webapp-resources/messages_lu.properties +++ b/webapp-resources/messages_lu.properties @@ -3351,4 +3351,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_nl.properties b/webapp-resources/messages_nl.properties index 65ca74d049..27cb445a41 100644 --- a/webapp-resources/messages_nl.properties +++ b/webapp-resources/messages_nl.properties @@ -3454,4 +3454,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_pl.properties b/webapp-resources/messages_pl.properties index f87c24c114..7c023cd1a0 100644 --- a/webapp-resources/messages_pl.properties +++ b/webapp-resources/messages_pl.properties @@ -3476,4 +3476,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_pt.properties b/webapp-resources/messages_pt.properties index 519e7c87d6..2857203574 100644 --- a/webapp-resources/messages_pt.properties +++ b/webapp-resources/messages_pt.properties @@ -3490,4 +3490,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_ru.properties b/webapp-resources/messages_ru.properties index e29966e7c2..5d9e6195e8 100644 --- a/webapp-resources/messages_ru.properties +++ b/webapp-resources/messages_ru.properties @@ -3486,4 +3486,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file diff --git a/webapp-resources/messages_zh.properties b/webapp-resources/messages_zh.properties index e92e77add9..dcb0f9ed12 100644 --- a/webapp-resources/messages_zh.properties +++ b/webapp-resources/messages_zh.properties @@ -3439,4 +3439,5 @@ systemsettings.webresource.uploads.path=Uploads images path systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" -event.ds.monitorWrite=Monitor write exception \ No newline at end of file +event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor \ No newline at end of file From 25b7bf97c870ace02bc3cd8c46efda068f298777 Mon Sep 17 00:00:00 2001 From: Kamil Date: Tue, 27 Feb 2024 01:14:59 +0100 Subject: [PATCH 15/63] #2755 Signaling the data source that has a problem: - added tests: InitializeDataSourceRtTest, InitializeWithErrorsDataSourceRtTest; - corrected test: DataPointUnreliableUtilsTest; - replacing class CommPortIdentifier from RXTXcomm.jar with a new class ScadaCommPortIdentifier: ASCIISerialDataSource, DrStorageHt5bDataSource, RadiuinoEventDataSource, RadiuinoPollingDataSource; - corrected signaling errors in: BACnetIPDataSourceRT, HttpReceiverDataSourceRT, ModbusDataSource, NmeaDataSourceRT, PachubeDataSourceRT, PersistentDataSourceRT, SnmpDataSourceRT, ViconicsDataSourceRT; - try catch Throwable; - change logging level from WARN to ERROR for dataSourceRtLoggingLevel, dataPointRtLoggingLevel (log4j2.xml); - refactoring DataPointUnreliableUtils; - added methods: DataPointRT.isUnreliable, DataPointRT.isSetUnreliable, DataSourceUtils.checkInitialized; --- build.gradle | 1 + .../asciiSerial/ASCIISerialDataSource.java | 5 +- .../rt/dataSource/dnp3/Dnp3DataSource.java | 20 +- .../dataSource/dnp3/Dnp3SerialDataSource.java | 6 +- .../DrStorageHt5bDataSource.java | 3 +- .../rt/dataSource/opc/OPCDataSource.java | 14 +- .../radiuino/RadiuinoEventDataSource.java | 5 +- .../radiuino/RadiuinoPollingDataSource.java | 5 +- src/com/serotonin/mango/Common.java | 3 +- .../serotonin/mango/rt/RuntimeManager.java | 11 +- .../mango/rt/dataImage/DataPointRT.java | 12 + .../dataSource/DataPointUnreliableUtils.java | 10 +- .../mango/rt/dataSource/DataSourceRT.java | 4 +- .../mango/rt/dataSource/DataSourceUtils.java | 6 + .../bacnet/BACnetIPDataSourceRT.java | 15 +- .../http/HttpReceiverDataSourceRT.java | 20 +- .../dataSource/modbus/ModbusDataSource.java | 48 +- .../modbus/ModbusSerialDataSource.java | 2 +- .../rt/dataSource/nmea/NmeaDataSourceRT.java | 7 +- .../pachube/PachubeDataSourceRT.java | 41 +- .../persistent/PersistentDataSourceRT.java | 2 +- .../rt/dataSource/snmp/SnmpDataSourceRT.java | 16 +- .../viconics/ViconicsDataSourceRT.java | 8 +- .../serotonin/mango/util/LoggingUtils.java | 6 +- .../http/HttpReceiverDataSourceVO.java | 10 +- .../pachube/PachubeDataSourceVO.java | 4 + .../ds/messaging/MessagingDataSourceRT.java | 38 +- .../channel/InitMessagingChannels.java | 2 +- .../channel/MessagingChannelsImpl.java | 6 +- .../channel/NonSyncOperationChannels.java | 2 +- .../channel/SyncOperationChannels.java | 8 +- .../channel/UpdatePointValueConsumer.java | 6 +- .../amqp/client/AmqpChannelFactory.java | 4 +- .../amqp/client/AmqpMessagingChannel.java | 4 +- .../amqp/client/AmqpMessagingChannels.java | 24 +- .../mqtt/client/MqttMessagingChannel.java | 6 +- .../mqtt/client/MqttMessagingChannels.java | 26 +- .../messaging/service/MessagingService.java | 2 +- .../service/MessagingServiceImpl.java | 24 +- .../gnu/io/ScadaCommPortIdentifier.java | 11 + test/br/org/scadabr/db/utils/TestUtils.java | 30 +- .../DataPointUnreliableUtilsTest.java | 547 ++++++++++++++---- .../InitializeDataSourceRtTest.java | 241 ++++++++ .../InitializeDataSourceRtTestsSuite.java | 12 + .../InitializeWithErrorsDataSourceRtTest.java | 213 +++++++ .../util/InitializeDataSourceRtMockUtils.java | 443 ++++++++++++++ webapp-resources/log4j2.xml | 4 +- 47 files changed, 1646 insertions(+), 291 deletions(-) create mode 100644 src/org/scada_lts/serial/gnu/io/ScadaCommPortIdentifier.java create mode 100644 test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java create mode 100644 test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java create mode 100644 test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java create mode 100644 test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java diff --git a/build.gradle b/build.gradle index b43c8d11a0..5fb6422fb4 100644 --- a/build.gradle +++ b/build.gradle @@ -206,5 +206,6 @@ test { includeTestsMatching "org.scada_lts.web.mvc.api.json.WorkItemInfoListTest" includeTestsMatching "org.scada_lts.monitor.ConcurrentMonitoredValuesTest" includeTestsMatching "com.serotonin.mango.rt.dataSource.DataPointUnreliableUtilsTest" + includeTestsMatching "com.serotonin.mango.rt.dataSource.InitializeDataSourceRtTestsSuite" } } \ No newline at end of file diff --git a/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java b/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java index 4efaea4018..5bae2f06ba 100644 --- a/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/asciiSerial/ASCIISerialDataSource.java @@ -27,6 +27,7 @@ import com.serotonin.mango.rt.dataSource.DataSourceUtils; import com.serotonin.mango.rt.dataSource.PollingDataSource; import com.serotonin.web.i18n.LocalizableMessage; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; public class ASCIISerialDataSource extends PollingDataSource { @@ -52,7 +53,7 @@ private boolean reconnect() { try { while (true) { Thread.sleep(5000); - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); SerialPort p = getPort(vo.getCommPortId()); if (p != null) { configurePort(getsPort()); @@ -215,7 +216,7 @@ protected void doPoll(long time) { @Override public void initialize() { try { - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); getPort(vo.getCommPortId()); configurePort(getsPort()); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java index 664a9b21e1..d74766a225 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3DataSource.java @@ -2,7 +2,6 @@ import java.net.ConnectException; import java.util.Calendar; -import java.util.Date; import java.util.List; import com.serotonin.mango.util.LoggingUtils; @@ -22,6 +21,9 @@ import com.serotonin.messaging.TimeoutException; import com.serotonin.web.i18n.LocalizableMessage; +import static com.serotonin.mango.rt.dataSource.DataSourceUtils.checkInitialized; + + public class Dnp3DataSource extends PollingDataSource { private final Log LOG = LogFactory.getLog(Dnp3DataSource.class); @@ -44,13 +46,12 @@ public Dnp3DataSource(Dnp3DataSourceVO vo) { protected void doPoll(long time) { try { + checkInitialized(dnp3Master, this); dnp3Master.doPoll(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); } catch (Throwable e) { LOG.warn(LoggingUtils.info(e, this), e); - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, - new LocalizableMessage("event.exception2", vo.getName(), e - .getMessage())); + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, getLocalExceptionMessage(e)); return; } @@ -88,9 +89,7 @@ public void terminate() { returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this), e); - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, - new LocalizableMessage("event.exception2", vo.getName(), e - .getMessage())); + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getLocalExceptionMessage(e)); } } @@ -104,6 +103,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, int index = pointLocator.getIndex(); try { + checkInitialized(dnp3Master, this); if (dataType == 0x10) { dnp3Master.controlCommand(valueTime.getValue().toString(), index, pointLocator.getControlCommand(), pointLocator @@ -115,13 +115,11 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, returnToNormal(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this), e); - raiseEvent(POINT_WRITE_EXCEPTION_EVENT, new Date().getTime(), true, - new LocalizableMessage("event.exception2", vo.getName(), e - .getMessage()), dataPoint); + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getLocalExceptionMessage(e), dataPoint); } } - protected LocalizableMessage getLocalExceptionMessage(Exception e) { + protected LocalizableMessage getLocalExceptionMessage(Throwable e) { if (e instanceof Exception) { Throwable cause = e.getCause(); if (cause instanceof TimeoutException) diff --git a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java index 271ec35665..a493f8d92b 100644 --- a/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/dnp3/Dnp3SerialDataSource.java @@ -34,9 +34,7 @@ public void initialize() { returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { LOG.error(LoggingUtils.info(e, this)); - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, - new LocalizableMessage("event.exception2", configuration - .getName(), e.getMessage())); + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, new Date().getTime(), true, getLocalExceptionMessage(e)); return; } @@ -44,7 +42,7 @@ public void initialize() { } @Override - protected LocalizableMessage getLocalExceptionMessage(Exception e) { + protected LocalizableMessage getLocalExceptionMessage(Throwable e) { if (e instanceof Exception) { Throwable cause = e.getCause(); if (cause instanceof NoSuchPortException) diff --git a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java index 5c56b471bb..7d87efceab 100644 --- a/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/drStorageHt5b/DrStorageHt5bDataSource.java @@ -20,6 +20,7 @@ import com.serotonin.mango.rt.dataImage.SetPointSource; import com.serotonin.mango.rt.dataSource.PollingDataSource; import com.serotonin.web.i18n.LocalizableMessage; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; public class DrStorageHt5bDataSource extends PollingDataSource { @@ -355,7 +356,7 @@ public void setsPort(SerialPort sPort) { @Override public void initialize() { try { - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); getPort(vo.getCommPortId()); configurePort(getsPort()); setValuesHt5b(new ArrayList<>()); diff --git a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java index f46c395c80..b3f84c3074 100644 --- a/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/opc/OPCDataSource.java @@ -37,14 +37,11 @@ public OPCDataSource(OPCDataSourceVO vo) { this.vo = vo; setPollingPeriod(vo.getUpdatePeriodType(), vo.getUpdatePeriods(), vo.isQuantize()); - - this.opcMaster = new RealOPCMaster(); - JISystem.getLogger().setLevel(Level.OFF); } @Override protected void doPoll(long time) { - ArrayList enabledTags = new ArrayList(); + ArrayList enabledTags = new ArrayList<>(); for (DataPointRT dataPoint : dataPoints) { OPCPointLocatorVO dataPointVO = dataPoint.getVO().getPointLocator(); @@ -126,6 +123,15 @@ else if (dataPoint.getDataTypeId() == DataTypes.MULTISTATE) } public void initialize() { + if(opcMaster != null) { + try { + opcMaster.terminate(); + } catch (Exception e) { + LOG.warn(LoggingUtils.info(e, this)); + } + } + this.opcMaster = new RealOPCMaster(); + JISystem.getLogger().setLevel(Level.OFF); opcMaster.setHost(vo.getHost()); opcMaster.setDomain(vo.getDomain()); diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java index 7fca33b1f8..41fafeca42 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoEventDataSource.java @@ -26,6 +26,7 @@ import com.serotonin.mango.rt.dataImage.SetPointSource; import com.serotonin.mango.rt.dataSource.EventDataSource; import com.serotonin.web.i18n.LocalizableMessage; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; public class RadiuinoEventDataSource extends EventDataSource implements SerialPortEventListener { @@ -58,7 +59,7 @@ private boolean reconnect() { try { while (true) { Thread.sleep(5000); - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); SerialPort p = getPort(vo.getCommPortId(), vo.getTimeout()); if (p != null) { LOG.debug("Conexao estabelecida com a porta serial"); @@ -80,7 +81,7 @@ public void initialize() { LOG.debug("Inicializando o Radiuino Polling Data Source."); try { - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); getPort(vo.getCommPortId(), vo.getTimeout()); configurePort(getsPort()); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); diff --git a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java index 90807c0e9d..ce7a8d2324 100644 --- a/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java +++ b/src/cc/radiuino/scadabr/rt/datasource/radiuino/RadiuinoPollingDataSource.java @@ -28,6 +28,7 @@ import com.serotonin.mango.rt.dataImage.SetPointSource; import com.serotonin.mango.rt.dataSource.PollingDataSource; import com.serotonin.web.i18n.LocalizableMessage; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; public class RadiuinoPollingDataSource extends PollingDataSource implements SerialPortEventListener { @@ -61,7 +62,7 @@ private boolean reconnect() { try { while (true) { Thread.sleep(5000); - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); SerialPort p = getPort(vo.getCommPortId(), vo.getTimeout()); if (p != null) { LOG.debug("Conexao estabelecida com a porta serial"); @@ -158,7 +159,7 @@ public void initialize() { LOG.debug("Inicializando o Radiuino Polling Data Source."); try { - portList = CommPortIdentifier.getPortIdentifiers(); + portList = ScadaCommPortIdentifier.getPortIdentifiers(); getPort(vo.getCommPortId(), vo.getTimeout()); configurePort(getsPort()); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); diff --git a/src/com/serotonin/mango/Common.java b/src/com/serotonin/mango/Common.java index 183dc05616..6f37aadc0e 100644 --- a/src/com/serotonin/mango/Common.java +++ b/src/com/serotonin/mango/Common.java @@ -59,6 +59,7 @@ import com.serotonin.util.PropertiesUtils; import com.serotonin.util.StringUtils; import com.serotonin.web.i18n.LocalizableMessage; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; import org.scada_lts.serial.SerialPortUtils; import org.springframework.security.core.GrantedAuthority; @@ -408,7 +409,7 @@ public static List getCommPorts() throws CommPortConfigException { try { List ports = new LinkedList(); - Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); + Enumeration portEnum = ScadaCommPortIdentifier.getPortIdentifiers(); CommPortIdentifier cpid; while (portEnum.hasMoreElements()) { cpid = (CommPortIdentifier) portEnum.nextElement(); diff --git a/src/com/serotonin/mango/rt/RuntimeManager.java b/src/com/serotonin/mango/rt/RuntimeManager.java index 41598f8b52..12f5b481e9 100644 --- a/src/com/serotonin/mango/rt/RuntimeManager.java +++ b/src/com/serotonin/mango/rt/RuntimeManager.java @@ -491,13 +491,14 @@ private void startDataPoint(DataPointVO vo) { // Add/update it in the data source. ds.addDataPoint(dataPoint); - boolean reliable = isReliable(dataPoint, ds); - if(reliable) - resetUnreliableDataPoint(dataPoint); - else + boolean unreliable = dataPoint.isUnreliable(); + + if(unreliable) setUnreliableDataPoint(dataPoint); + else + resetUnreliableDataPoint(dataPoint); - LOG.info("Data point '" + vo.getExtendedName() + "' initialized - reliable: " + reliable); + LOG.info("Data point '" + vo.getExtendedName() + "' initialized - unreliable: " + unreliable); } } } diff --git a/src/com/serotonin/mango/rt/dataImage/DataPointRT.java b/src/com/serotonin/mango/rt/dataImage/DataPointRT.java index 61971a2f4b..0b06f0e13d 100644 --- a/src/com/serotonin/mango/rt/dataImage/DataPointRT.java +++ b/src/com/serotonin/mango/rt/dataImage/DataPointRT.java @@ -24,6 +24,8 @@ import com.serotonin.mango.rt.RuntimeManager; import com.serotonin.mango.rt.dataImage.types.MangoValue; import com.serotonin.mango.rt.dataImage.types.NumericValue; +import com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils; +import com.serotonin.mango.rt.dataSource.DataSourceRT; import com.serotonin.mango.rt.dataSource.PointLocatorRT; import com.serotonin.mango.rt.event.detectors.PointEventDetectorRT; import com.serotonin.mango.rt.maint.work.AbstractBeforeAfterWorkItem; @@ -631,4 +633,14 @@ public void terminateHistorical() { terminateIntervalLogging(); } + public boolean isUnreliable() { + DataSourceRT dataSourceRT = Common.ctx.getRuntimeManager().getRunningDataSource(getDataSourceId()); + if(dataSourceRT == null) + return true; + return !dataSourceRT.isInitialized() || isSetUnreliable(); + } + + public boolean isSetUnreliable() { + return DataPointUnreliableUtils.isSetUnreliable(this, true); + } } diff --git a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java index 7449fb067b..f2f85221d0 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java +++ b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java @@ -17,8 +17,9 @@ public final class DataPointUnreliableUtils { private DataPointUnreliableUtils() {} - public static boolean isReliable(DataPointRT dataPoint, DataSourceRT dataSource) { - return dataSource.isInitialized() && (!isSetUnreliable(dataPoint, true) || isSetUnreliable(dataPoint, false)); + public static boolean isSetUnreliable(DataPointRT dataPoint, boolean unreliable) { + return dataPoint.getAttribute(ATTR_UNRELIABLE_KEY) != null + && ((boolean) dataPoint.getAttribute(ATTR_UNRELIABLE_KEY)) == unreliable; } public static void setUnreliableDataPoints(List dataPoints) { @@ -63,8 +64,5 @@ private static List filter(List dataPoints, boolean un .collect(Collectors.toList()); } - private static boolean isSetUnreliable(DataPointRT dataPoint, boolean unreliable) { - return dataPoint.getAttribute(ATTR_UNRELIABLE_KEY) != null - && ((boolean) dataPoint.getAttribute(ATTR_UNRELIABLE_KEY)) == unreliable; - } + } \ No newline at end of file diff --git a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java index b4589ec4ba..3e95f81a1e 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java @@ -208,7 +208,7 @@ protected DataSourceEventType getEventType(int eventId) { return null; } - protected LocalizableMessage getSerialExceptionMessage(Exception e, String portId) { + protected LocalizableMessage getSerialExceptionMessage(Throwable e, String portId) { if (e instanceof NoSuchPortException) return new LocalizableMessage("event.serial.portOpenError", portId); if (e instanceof PortInUseException) @@ -216,7 +216,7 @@ protected LocalizableMessage getSerialExceptionMessage(Exception e, String portI return getExceptionMessage(e); } - protected static LocalizableMessage getExceptionMessage(Exception e) { + protected static LocalizableMessage getExceptionMessage(Throwable e) { return new LocalizableMessage("event.exception2", e.getClass().getName(), e.getMessage()); } diff --git a/src/com/serotonin/mango/rt/dataSource/DataSourceUtils.java b/src/com/serotonin/mango/rt/dataSource/DataSourceUtils.java index c9192cfc30..3a457be92e 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataSourceUtils.java +++ b/src/com/serotonin/mango/rt/dataSource/DataSourceUtils.java @@ -152,4 +152,10 @@ public static MangoValue getValue(String valueStr, int dataTypeId, return null; } + + public static void checkInitialized(T master, DataSourceRT dataSource) { + if(master == null || !dataSource.isInitialized()) { + throw new IllegalStateException("Data Source not initialized!"); + } + } } diff --git a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java index 4360f08ea7..db191de006 100644 --- a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java @@ -104,7 +104,7 @@ public class BACnetIPDataSourceRT extends PollingDataSource implements DeviceEve final Log log = LogFactory.getLog(BACnetIPDataSourceRT.class); final BACnetIPDataSourceVO vo; private LocalDevice localDevice; - private boolean initialized = false; + private volatile boolean initialized = false; final List pollsInProgress = new ArrayList(); private CovResubscriptionTask covResubscriptionTask; @@ -139,7 +139,7 @@ public void initialize() { // Deactivate any existing event. returnToNormal(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis()); } - catch (Exception e) { + catch (Throwable e) { raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); return; @@ -154,12 +154,13 @@ public void initialize() { } catch (BACnetException e) { fireMessageExceptionEvent("event.bacnet.iamError", e.getMessage()); + return; } // Find out who we're slummin with. try { localDevice.sendBroadcast(new WhoIsRequest()); - + returnToNormal(); // Wait for responses to come in. try { Thread.sleep(vo.getTimeout() / 4); @@ -170,9 +171,10 @@ public void initialize() { } catch (BACnetException e) { fireMessageExceptionEvent("event.bacnet.whoisError", e.getMessage()); + return; } - initialized = true; + initialized = isInitialized(localDevice); } @Override @@ -207,6 +209,7 @@ public void terminate() { } } LocalDevice.setExceptionListener(null); + initialized = isInitialized(localDevice); } @Override @@ -809,4 +812,8 @@ else if (value instanceof AlphanumericValue) { public boolean isInitialized() { return initialized; } + + private boolean isInitialized(LocalDevice localDevice) { + return localDevice != null && localDevice.isInitialized() && super.isInitialized(); + } } diff --git a/src/com/serotonin/mango/rt/dataSource/http/HttpReceiverDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/http/HttpReceiverDataSourceRT.java index 6fd1ef1bfa..6ccf382673 100644 --- a/src/com/serotonin/mango/rt/dataSource/http/HttpReceiverDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/http/HttpReceiverDataSourceRT.java @@ -18,6 +18,8 @@ */ package com.serotonin.mango.rt.dataSource.http; +import com.serotonin.mango.util.LoggingUtils; +import com.serotonin.web.i18n.LocalizableMessage; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -36,6 +38,8 @@ * @author Matthew Lohbihler */ public class HttpReceiverDataSourceRT extends EventDataSource implements HttpMulticastListener { + + public static final int INITIALIZATION_EXCEPTION_EVENT = 1; private final Log log = LogFactory.getLog(HttpReceiverDataSourceRT.class); private final HttpReceiverDataSourceVO vo; @@ -51,14 +55,26 @@ public HttpReceiverDataSourceRT(HttpReceiverDataSourceVO vo) { // @Override public void initialize() { - Common.ctx.getHttpReceiverMulticaster().addListener(this); + try { + Common.ctx.getHttpReceiverMulticaster().addListener(this); + returnToNormal(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(INITIALIZATION_EXCEPTION_EVENT, + System.currentTimeMillis(), true, new LocalizableMessage( + "event.initializationError", e.getMessage())); + return; + } super.initialize(); } @Override public void terminate() { super.terminate(); - Common.ctx.getHttpReceiverMulticaster().removeListener(this); + try { + Common.ctx.getHttpReceiverMulticaster().removeListener(this); + } catch (Throwable e) { + log.warn(LoggingUtils.info(e, this), e); + } } // diff --git a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java index b6d7ab015d..720138125b 100644 --- a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java @@ -52,6 +52,7 @@ import com.serotonin.web.i18n.LocalizableMessage; import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; +import static com.serotonin.mango.rt.dataSource.DataSourceUtils.checkInitialized; abstract public class ModbusDataSource extends PollingDataSource implements MessagingExceptionHandler { @@ -151,8 +152,14 @@ public void removeDataPoint(DataPointRT dataPoint) { @Override protected void doPoll(long time) { - - + try { + checkInitialized(modbusMaster, this); + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); + } catch (Throwable e) { + raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, + getLocalExceptionMessage(e)); + return; + } if (!modbusMaster.isInitialized()) { if (vo.isCreateSlaveMonitorPoints()) { @@ -350,7 +357,7 @@ protected void initialize(ModbusMaster modbusMaster) { // Deactivate any existing event. returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getLocalExceptionMessage(e)); return; @@ -362,26 +369,6 @@ protected void initialize(ModbusMaster modbusMaster) { @Override public void forcePointRead(DataPointRT dataPoint) { - if (!modbusMaster.isInitialized()) { - // terminate(); - // - // vo.setEnabled(false); - // - // RuntimeManager runtimeManager = Common.ctx.getRuntimeManager(); - // - // for (DataPointRT dP : dataPoints) { - // dP.getVO().setEnabled(false); - // } - // - // for (DataPointRT dP : dataPoints) { - // dP.getVO().setEnabled(true); - // runtimeManager.saveDataPoint(dP.getVO()); - // } - // - // vo.setEnabled(true); - // runtimeManager.saveDataSource(vo); - } - ModbusPointLocatorRT pl = dataPoint.getPointLocator(); if (pl.getVO().isSlaveMonitor() || pl.getVO().isSocketMonitor()) // Nothing to do @@ -392,6 +379,7 @@ public void forcePointRead(DataPointRT dataPoint) { synchronized (pointListChangeLock) { try { + checkInitialized(modbusMaster, this); Object value = modbusMaster.getValue(ml); updatePointValue(dataPoint, pl, value, time); returnToNormal(POINT_READ_EXCEPTION_EVENT, time, dataPoint); @@ -399,7 +387,7 @@ public void forcePointRead(DataPointRT dataPoint) { raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.exception2", dataPoint .getVO().getName(), e.getMessage()), dataPoint); - } catch (ModbusTransportException e) { + } catch (Throwable e) { // Don't raise a data source exception. Polling should do that. LOG.warn("Error during forcePointRead", e); setUnreliableDataPoint(dataPoint); @@ -429,7 +417,8 @@ else if (pl.getVO().getDataTypeId() == DataTypes.ALPHANUMERIC) @Override public void terminate() { super.terminate(); - modbusMaster.destroy(); + if(modbusMaster != null) + modbusMaster.destroy(); } // @@ -444,6 +433,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, BaseLocator ml = createModbusLocator(pl.getVO()); try { + checkInitialized(modbusMaster, this); // See if this is a numeric value that needs to be converted. if (dataPoint.getDataTypeId() == DataTypes.NUMERIC) { double convertedValue = valueTime.getDoubleValue(); @@ -482,6 +472,10 @@ true, new LocalizableMessage("event.exception2", .getVO().getName(), e.getErrorResponse() .getExceptionMessage()), dataPoint); LOG.info("Error setting point value", e); + } catch (Throwable e) { + raiseEvent(POINT_WRITE_EXCEPTION_EVENT, valueTime.getTime(), + true, new LocalizableMessage("event.exception2", + dataPoint.getVO().getName(), e.getMessage()), dataPoint); } } @@ -491,7 +485,7 @@ public static BaseLocator createModbusLocator(ModbusPointLocatorVO vo) { vo.getRegisterCount(), Charset.forName(vo.getCharset())); } - public static LocalizableMessage localExceptionMessage(Exception e) { + public static LocalizableMessage localExceptionMessage(Throwable e) { if (e instanceof ModbusTransportException) { Throwable cause = e.getCause(); if (cause instanceof TimeoutException) @@ -504,7 +498,7 @@ public static LocalizableMessage localExceptionMessage(Exception e) { return DataSourceRT.getExceptionMessage(e); } - protected LocalizableMessage getLocalExceptionMessage(Exception e) { + protected LocalizableMessage getLocalExceptionMessage(Throwable e) { return localExceptionMessage(e); } diff --git a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusSerialDataSource.java b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusSerialDataSource.java index c50b129b79..c0630c9b77 100644 --- a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusSerialDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusSerialDataSource.java @@ -112,7 +112,7 @@ public boolean verifyPort(String port) { } @Override - protected LocalizableMessage getLocalExceptionMessage(Exception e) { + protected LocalizableMessage getLocalExceptionMessage(Throwable e) { if (e instanceof ModbusInitException) { Throwable cause = e.getCause(); if (cause instanceof NoSuchPortException) diff --git a/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java index f8d1a0b7f1..1a958bd4c1 100644 --- a/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java @@ -86,7 +86,7 @@ synchronized private boolean initNmea() { // Deactivate any existing event. returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } - catch (Exception e) { + catch (Throwable e) { LocalizableMessage message = getSerialExceptionMessage(e, vo.getCommPortId()); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, message); log.debug("Error while initializing data source", e); @@ -97,7 +97,8 @@ synchronized private boolean initNmea() { } synchronized private void termNmea() { - nmeaReceiver.terminate(); + if(nmeaReceiver != null) + nmeaReceiver.terminate(); } // @@ -126,7 +127,7 @@ public void receivedMessage(NmeaMessage message) { if (parseError == null) parseError = e.getLocalizableMessage(); } - catch (Exception e) { + catch (Throwable e) { if (parseError == null) parseError = new LocalizableMessage("event.exception2", dp.getVO().getName(), e.getMessage()); } diff --git a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java index 87d46ca00c..0f4e8f16e3 100644 --- a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java @@ -65,23 +65,35 @@ public class PachubeDataSourceRT extends PollingDataSource { public static final int DATA_RETRIEVAL_FAILURE_EVENT = 1; public static final int PARSE_EXCEPTION_EVENT = 2; public static final int POINT_WRITE_EXCEPTION_EVENT = 3; + public static final int INITIALIZATION_EXCEPTION_EVENT = 4; public static final String HEADER_API_KEY = "X-PachubeApiKey"; final Log log = LogFactory.getLog(PachubeDataSourceRT.class); final PachubeDataSourceVO vo; - private final HttpClient httpClient; - final SimpleDateFormat sdf; + private HttpClient httpClient; + private SimpleDateFormat sdf; public PachubeDataSourceRT(PachubeDataSourceVO vo) { super(vo); setPollingPeriod(vo.getUpdatePeriodType(), vo.getUpdatePeriods(), false); this.vo = vo; + } - httpClient = createHttpClient(vo.getTimeoutSeconds(), vo.getRetries()); - - sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); - sdf.setTimeZone(TimeZone.getTimeZone("UTC")); + @Override + public void initialize() { + try { + httpClient = createHttpClient(vo.getTimeoutSeconds(), vo.getRetries()); + sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + sdf.setTimeZone(TimeZone.getTimeZone("UTC")); + returnToNormal(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis()); + } catch (Throwable e) { + raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, + new LocalizableMessage("event.exception2", + vo.getName(), e.getMessage())); + return; + } + super.initialize(); } public static HttpClient createHttpClient(int timeoutSeconds, int retries) { @@ -139,19 +151,19 @@ protected void pollFeed(int feedId, List points, long time) { try { data = getData(httpClient, feedId, vo.getApiKey()); } - catch (Exception e) { + catch (Throwable e) { LocalizableMessage lm; if (e instanceof LocalizableException) lm = ((LocalizableException) e).getLocalizableMessage(); else lm = new LocalizableMessage("event.pachube.feed.retrievalError", feedId, e.getMessage()); - raiseEvent(DATA_RETRIEVAL_FAILURE_EVENT, time, true, lm, points); + raiseEvent(DATA_RETRIEVAL_FAILURE_EVENT, time, true, lm); return; } // If we made it this far, everything is good. - returnToNormal(DATA_RETRIEVAL_FAILURE_EVENT, time, points); + returnToNormal(DATA_RETRIEVAL_FAILURE_EVENT, time); // We have the data. Now run the regex. LocalizableMessage parseErrorMessage = null; @@ -182,26 +194,27 @@ protected void pollFeed(int feedId, List points, long time) { // Save the new value if it is new if (!ObjectUtils.isEqual(dp.getPointValue(), pvt)) dp.updatePointValue(new PointValueTime(value, valueTime)); - resetUnreliableDataPoint(dp); } catch (LocalizableException e) { if (parseErrorMessage == null) parseErrorMessage = e.getLocalizableMessage(); - setUnreliableDataPoint(dp); } catch (ParseException e) { if (parseErrorMessage == null) parseErrorMessage = new LocalizableMessage("event.valueParse.timeParsePoint", dataValue.getTimestamp(), dp.getVO().getName()); - setUnreliableDataPoint(dp); + } + catch (Throwable e) { + if (parseErrorMessage == null) + parseErrorMessage = new LocalizableMessage("common.default", e.getMessage()); } } } if (parseErrorMessage != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseErrorMessage, points); + raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseErrorMessage); else - returnToNormal(PARSE_EXCEPTION_EVENT, time, points); + returnToNormal(PARSE_EXCEPTION_EVENT, time); } public static Map getData(HttpClient client, int feedId, String apiKey) diff --git a/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java index f9d0a60c0e..8aec6349fd 100644 --- a/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/persistent/PersistentDataSourceRT.java @@ -104,7 +104,7 @@ public void initialize() { returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } - catch (IOException e) { + catch (Throwable e) { serverSocket = null; raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); diff --git a/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java index c6bd7706c3..2598033a8c 100644 --- a/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/snmp/SnmpDataSourceRT.java @@ -108,7 +108,7 @@ private void finishTime(){ private final Log log = LogFactory.getLog(SnmpDataSourceRT.class); private final SnmpDataSourceVO vo; - private final Version version; + private Version version; private String address; private Target target; private Snmp snmp; @@ -124,12 +124,6 @@ public SnmpDataSourceRT(SnmpDataSourceVO vo) { super(vo); setPollingPeriod(vo.getUpdatePeriodType(), vo.getUpdatePeriods(), false); this.vo = vo; - version = Version.getVersion(vo.getSnmpVersion(), vo.getCommunity(), - vo.getSecurityName(), vo.getAuthProtocol(), - vo.getAuthPassphrase(), vo.getPrivProtocol(), - vo.getPrivPassphrase(), vo.getSecurityLevel(), - vo.getContextName()); - snmpRequests = new SnmpResponses(); } @Override @@ -383,6 +377,12 @@ private void updatePoint(DataPointRT dp, Variable variable, long time) { @Override public void initialize() { try { + version = Version.getVersion(vo.getSnmpVersion(), vo.getCommunity(), + vo.getSecurityName(), vo.getAuthProtocol(), + vo.getAuthPassphrase(), vo.getPrivProtocol(), + vo.getPrivPassphrase(), vo.getSecurityLevel(), + vo.getContextName()); + snmpRequests = new SnmpResponses(); initializeComponents(); counterEmptyResponsesOrResponsesWithError=0; log.info("Counter Empty Responses Or Responses With Error is set 0."); @@ -392,7 +392,7 @@ public void initialize() { // Deactivate any existing event. returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, DataSourceRT.getExceptionMessage(e)); log.debug("Error while initializing data source", e); diff --git a/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java index 53637ee9bc..00871415e4 100644 --- a/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/viconics/ViconicsDataSourceRT.java @@ -110,7 +110,7 @@ public ViconicsDataSourceRT(ViconicsDataSourceVO vo) { public void initialize() { try { network = new ViconicsNetwork(vo.getCommPortId(), Common.timer); - } catch (ViconicsConfigurationException e) { + } catch (Throwable e) { raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); @@ -129,7 +129,7 @@ public void initialize() { try { network.init(); network.startNetwork(vo.getPanId(), vo.getChannel()); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); @@ -494,7 +494,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime pvt, locator.getPointAddress(), value); dataPoint.setPointValue(pvt, source); returnToNormal(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent( MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), @@ -513,7 +513,7 @@ public void forcePointRead(DataPointRT dataPoint) { network.readValue(locator.getDeviceIeee(), locator.getPointAddress()); returnToNormal(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { + } catch (Throwable e) { raiseEvent( MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), diff --git a/src/com/serotonin/mango/util/LoggingUtils.java b/src/com/serotonin/mango/util/LoggingUtils.java index 44c0edebae..d19e832bb6 100644 --- a/src/com/serotonin/mango/util/LoggingUtils.java +++ b/src/com/serotonin/mango/util/LoggingUtils.java @@ -135,12 +135,12 @@ public static String dataSourcePointValueTimeInfo(DataSourceVO dataSource, Da return LoggingUtils.dataSourceInfo(dataSource) + ", " + LoggingUtils.dataPointInfo(dataPoint) + ", " + LoggingUtils.pointValueTimeInfo(valueTime, source); } - public static String causeInfo(Exception e) { + public static String causeInfo(Throwable e) { return exceptionInfo(getCause(e)); } - public static Exception getCause(Exception e) { - return e.getCause() != null ? (Exception) e.getCause() : e; + public static Throwable getCause(Throwable e) { + return e.getCause() != null ? e.getCause() : e; } public static String userInfo(User user) { diff --git a/src/com/serotonin/mango/vo/dataSource/http/HttpReceiverDataSourceVO.java b/src/com/serotonin/mango/vo/dataSource/http/HttpReceiverDataSourceVO.java index 985db8511b..bfa47fd9bb 100644 --- a/src/com/serotonin/mango/vo/dataSource/http/HttpReceiverDataSourceVO.java +++ b/src/com/serotonin/mango/vo/dataSource/http/HttpReceiverDataSourceVO.java @@ -47,12 +47,18 @@ public class HttpReceiverDataSourceVO extends DataSourceVO ets) { - // no op + ets.add(createEventType(HttpReceiverDataSourceRT.INITIALIZATION_EXCEPTION_EVENT, new LocalizableMessage( + "event.ds.initialization"))); } @Override public ExportCodes getEventCodes() { - return null; + return EVENT_CODES; + } + + private static final ExportCodes EVENT_CODES = new ExportCodes(); + static { + EVENT_CODES.addElement(HttpReceiverDataSourceRT.INITIALIZATION_EXCEPTION_EVENT, "INITIALIZATION_EXCEPTION"); } @Override diff --git a/src/com/serotonin/mango/vo/dataSource/pachube/PachubeDataSourceVO.java b/src/com/serotonin/mango/vo/dataSource/pachube/PachubeDataSourceVO.java index 3761b1f421..c8a7eb34ef 100644 --- a/src/com/serotonin/mango/vo/dataSource/pachube/PachubeDataSourceVO.java +++ b/src/com/serotonin/mango/vo/dataSource/pachube/PachubeDataSourceVO.java @@ -54,6 +54,9 @@ protected void addEventTypes(List ets) { "event.ds.dataParse"))); ets.add(createEventType(PachubeDataSourceRT.POINT_WRITE_EXCEPTION_EVENT, new LocalizableMessage( "event.ds.pointWrite"))); + ets.add(createEventType(PachubeDataSourceRT.INITIALIZATION_EXCEPTION_EVENT, new LocalizableMessage( + "event.ds.initialization" + ))); } private static final ExportCodes EVENT_CODES = new ExportCodes(); @@ -61,6 +64,7 @@ protected void addEventTypes(List ets) { EVENT_CODES.addElement(PachubeDataSourceRT.DATA_RETRIEVAL_FAILURE_EVENT, "DATA_RETRIEVAL_FAILURE"); EVENT_CODES.addElement(PachubeDataSourceRT.PARSE_EXCEPTION_EVENT, "PARSE_EXCEPTION"); EVENT_CODES.addElement(PachubeDataSourceRT.POINT_WRITE_EXCEPTION_EVENT, "POINT_WRITE_EXCEPTION"); + EVENT_CODES.addElement(PachubeDataSourceRT.INITIALIZATION_EXCEPTION_EVENT, "INITIALIZATION_EXCEPTION"); } @Override diff --git a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java index 70e5477867..cc107699d8 100644 --- a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java +++ b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java @@ -22,8 +22,6 @@ public class MessagingDataSourceRT extends PollingDataSource { - private static final String ATTR_UPDATE_ERROR_KEY = "DP_UPDATE_ERROR"; - public static final int DATA_SOURCE_EXCEPTION_EVENT = 1; public static final int DATA_POINT_PUBLISH_EXCEPTION_EVENT = 2; public static final int DATA_POINT_INIT_EXCEPTION_EVENT = 3; @@ -59,7 +57,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPo try { messagingService.publish(dataPoint, message); returnToNormal(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { + } catch (Throwable e) { LOG.error(dataSourcePointValueTimeInfo(vo, dataPointVO, valueTime, source) + ", " + exceptionInfo(e), e); raiseEvent(DATA_POINT_PUBLISH_EXCEPTION_EVENT, System.currentTimeMillis(), true, @@ -72,8 +70,8 @@ public void initialize() { try { messagingService.open(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { - LOG.error(exceptionInfo(e), e); + } catch (Throwable e) { + LOG.error(info(e, this), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e)); return; @@ -88,8 +86,8 @@ public void terminate() { try { messagingService.close(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); - } catch (Exception e) { - LOG.error(exceptionInfo(e), e); + } catch (Throwable e) { + LOG.error(info(e, this), e); raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e)); } finally { @@ -103,8 +101,8 @@ public void addDataPoint(DataPointRT dataPoint) { updateAttemptsCounters.putIfAbsent(dataPoint.getId(), new AtomicInteger()); messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), getPointUpdateReturnToNormalHandler()); returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { - LOG.error(exceptionInfo(e), e); + } catch (Throwable e) { + LOG.error(info(e, this), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e), dataPoint); } @@ -116,8 +114,8 @@ public void removeDataPoint(DataPointRT dataPoint) { try { messagingService.removeReceiver(dataPoint); returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); - } catch (Exception e) { - LOG.error(exceptionInfo(e), e); + } catch (Throwable e) { + LOG.error(info(e, this), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e), dataPoint); } finally { @@ -130,22 +128,26 @@ public void removeDataPoint(DataPointRT dataPoint) { protected void doPoll(long time) { for (DataPointRT dataPoint : dataPoints) { try { - updateAttemptsCounters.putIfAbsent(dataPoint.getId(), new AtomicInteger()); - if(updateAttemptsCounters.get(dataPoint.getId()).get() < updateAttempts) { - messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), getPointUpdateReturnToNormalHandler()); - updateAttemptsCounters.get(dataPoint.getId()).set(0); + if(!messagingService.isOpen(dataPoint)) { + updateAttemptsCounters.putIfAbsent(dataPoint.getId(), new AtomicInteger()); + if (updateAttemptsCounters.get(dataPoint.getId()).get() < updateAttempts) { + messagingService.initReceiver(dataPoint, getPointUpdateExceptionHandler(dataPoint), getPointUpdateReturnToNormalHandler()); + updateAttemptsCounters.get(dataPoint.getId()).set(0); + returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); + } + } else { returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } - } catch (Exception e) { + } catch (Throwable e) { updateAttemptsCounters.get(dataPoint.getId()).incrementAndGet(); - LOG.warn(exceptionInfo(e), e); + LOG.error(info(e, this), e); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e), dataPoint); } } } - private java.util.function.Consumer getPointUpdateExceptionHandler(DataPointRT dataPoint) { + private java.util.function.Consumer getPointUpdateExceptionHandler(DataPointRT dataPoint) { return ex -> { LOG.warn("Error Update: " + dataPointInfo(dataPoint.getVO()) + ", " + dataSourceInfo(vo) + ", " + exceptionInfo(ex), ex); diff --git a/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java b/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java index d9bef828c9..94ff8d43de 100644 --- a/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java +++ b/src/org/scada_lts/ds/messaging/channel/InitMessagingChannels.java @@ -7,5 +7,5 @@ import java.util.function.Supplier; public interface InitMessagingChannels extends MessagingChannels { - void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException; + void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException; } diff --git a/src/org/scada_lts/ds/messaging/channel/MessagingChannelsImpl.java b/src/org/scada_lts/ds/messaging/channel/MessagingChannelsImpl.java index 84fb607793..2577e22d51 100644 --- a/src/org/scada_lts/ds/messaging/channel/MessagingChannelsImpl.java +++ b/src/org/scada_lts/ds/messaging/channel/MessagingChannelsImpl.java @@ -26,7 +26,7 @@ public void removeChannel(DataPointRT dataPoint) throws MessagingChannelExceptio channel.close(timeout); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Remove Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -46,7 +46,7 @@ public void initChannel(DataPointRT dataPoint, Supplier create getChannel(dataPoint).orElseGet(() -> operationChannels.createChannelIfNotExists(dataPoint.getId(), a -> create.get())); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Init Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -58,7 +58,7 @@ public void publish(DataPointRT dataPoint, String message) { channel.publish(message); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Publish: " + dataPointInfo(dataPoint.getVO()) + ", Value: " + message + ", " + exceptionInfo(e), e); } }); diff --git a/src/org/scada_lts/ds/messaging/channel/NonSyncOperationChannels.java b/src/org/scada_lts/ds/messaging/channel/NonSyncOperationChannels.java index 347018a3a9..82c912ee71 100644 --- a/src/org/scada_lts/ds/messaging/channel/NonSyncOperationChannels.java +++ b/src/org/scada_lts/ds/messaging/channel/NonSyncOperationChannels.java @@ -23,7 +23,7 @@ public void closeChannels(int timeout) throws MessagingChannelException { for(MessagingChannel channel: chs.values()) { try { channel.close(timeout); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Init Channel: " + channel.getClass().getName() + ", " + exceptionInfo(ex), ex); } } diff --git a/src/org/scada_lts/ds/messaging/channel/SyncOperationChannels.java b/src/org/scada_lts/ds/messaging/channel/SyncOperationChannels.java index 08e823af3f..438208248c 100644 --- a/src/org/scada_lts/ds/messaging/channel/SyncOperationChannels.java +++ b/src/org/scada_lts/ds/messaging/channel/SyncOperationChannels.java @@ -1,7 +1,9 @@ package org.scada_lts.ds.messaging.channel; -import net.bull.javamelody.internal.common.LOG; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.scada_lts.ds.messaging.exception.MessagingChannelException; +import org.scada_lts.ds.messaging.protocol.amqp.client.AmqpMessagingChannels; import java.util.HashMap; import java.util.Map; @@ -12,6 +14,8 @@ class SyncOperationChannels implements OperationChannels { + private static final Log LOG = LogFactory.getLog(AmqpMessagingChannels.class); + private final Map channels; private final ReentrantReadWriteLock lock; @@ -28,7 +32,7 @@ public void closeChannels(int timeout) throws MessagingChannelException { for(MessagingChannel channel: chs.values()) { try { channel.close(timeout); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Init Channel: " + channel.getClass().getName() + ", " + exceptionInfo(ex), ex); } } diff --git a/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java b/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java index 46362d5d62..ea50e9c3b1 100644 --- a/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java +++ b/src/org/scada_lts/ds/messaging/channel/UpdatePointValueConsumer.java @@ -10,10 +10,10 @@ public class UpdatePointValueConsumer implements Consumer { private final DataPointRT dataPoint; private final Writable writable; - private final Consumer exceptionHandler; + private final Consumer exceptionHandler; private final Supplier returnToNormal; - public UpdatePointValueConsumer(DataPointRT dataPoint, Writable writable, Consumer exceptionHandler, Supplier returnToNormal) { + public UpdatePointValueConsumer(DataPointRT dataPoint, Writable writable, Consumer exceptionHandler, Supplier returnToNormal) { this.dataPoint = dataPoint; this.writable = writable; this.exceptionHandler = exceptionHandler; @@ -27,7 +27,7 @@ public void accept(byte[] payload) { String message = new String(payload, StandardCharsets.UTF_8); dataPoint.updatePointValue(message); returnToNormal.get(); - } catch (Exception ex) { + } catch (Throwable ex) { exceptionHandler.accept(ex); } } diff --git a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java index 213b65c025..f6d6762461 100644 --- a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java +++ b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpChannelFactory.java @@ -14,7 +14,7 @@ final class AmqpChannelFactory { private AmqpChannelFactory() {} - static AmqpChannel createReceiver(DataPointRT dataPoint, AmqpConnection connection, Consumer exceptionHandler, Supplier returnToNormal) throws IOException { + static AmqpChannel createReceiver(DataPointRT dataPoint, AmqpConnection connection, Consumer exceptionHandler, Supplier returnToNormal) throws IOException { AmqpChannel receive = configChannel(dataPoint, connection); if(receive == null) return null; @@ -59,7 +59,7 @@ private static void basicQos(AmqpChannel channel, AmqpPointLocatorVO vo) throws channel.basicQos(vo.getQos()); } - private static void basicConsume(DataPointRT dataPoint, AmqpChannel channel, Consumer exceptionHandler, Supplier returnToNormal) throws IOException { + private static void basicConsume(DataPointRT dataPoint, AmqpChannel channel, Consumer exceptionHandler, Supplier returnToNormal) throws IOException { AmqpPointLocatorRT locator = dataPoint.getPointLocator(); AmqpPointLocatorVO vo = locator.getVO(); boolean noAck = vo.getMessageAck() == MessageAckType.NO_ACK; diff --git a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannel.java b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannel.java index b10b51c995..c5ef9311e1 100644 --- a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannel.java +++ b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannel.java @@ -32,7 +32,7 @@ public void close(int timeout) throws MessagingChannelException { channel.close(); } catch (IOException e) { throw new MessagingChannelException("Error Close Channel: " + dataPointInfo(dataPointRT.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Close Channel: " + dataPointInfo(dataPointRT.getVO()) + ", " + exceptionInfo(e), e); } } @@ -43,7 +43,7 @@ public void publish(String message) throws MessagingChannelException { basicPublish(dataPointRT, channel, message); } catch (IOException e) { throw new MessagingChannelException("Error Publish: " + dataPointInfo(dataPointRT.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Publish: " + dataPointInfo(dataPointRT.getVO()) + ", " + exceptionInfo(e), e); } } diff --git a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java index ffded69691..ccbb63a99e 100644 --- a/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java +++ b/src/org/scada_lts/ds/messaging/protocol/amqp/client/AmqpMessagingChannels.java @@ -37,11 +37,11 @@ public void openConnection() throws MessagingChannelException { } catch (IOException e) { try { connectionManager.close(); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Close Channel: " + exceptionInfo(e), e); } throw new MessagingChannelException("Error Open Channel: " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { try { connectionManager.close(); } catch (Exception ex) { @@ -57,7 +57,7 @@ public void removeChannel(DataPointRT dataPoint) throws MessagingChannelExceptio channels.removeChannel(dataPoint); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Remove Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } finally { if (channels.size() == 0) { @@ -76,13 +76,13 @@ public boolean isOpenChannel(DataPointRT dataPoint) { } @Override - public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { + public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { connectionManager.getIfOpen().or(() -> { try { return Optional.ofNullable(connectionManager.open(vo)); } catch (IOException e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }).ifPresent(conn -> { @@ -97,7 +97,7 @@ public void initChannel(DataPointRT dataPoint, Consumer exceptionHand }}); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Init Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }); @@ -110,7 +110,7 @@ public void initChannel(DataPointRT dataPoint, Supplier create return Optional.ofNullable(connectionManager.open(vo)); } catch (IOException e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }).ifPresent(conn -> { @@ -118,7 +118,7 @@ public void initChannel(DataPointRT dataPoint, Supplier create channels.initChannel(dataPoint, create); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Init Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }); @@ -131,7 +131,7 @@ public void publish(DataPointRT dataPoint, String message) throws MessagingChann return Optional.ofNullable(connectionManager.open(vo)); } catch (IOException e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Open Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }).ifPresent(conn -> { @@ -139,7 +139,7 @@ public void publish(DataPointRT dataPoint, String message) throws MessagingChann channels.publish(dataPoint, message); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Publish: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } }); @@ -154,12 +154,12 @@ public boolean isOpenConnection() { public void closeChannels() throws MessagingChannelException { try { channels.closeChannels(); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Close Channels: " + exceptionInfo(ex), ex); } finally { try { connectionManager.close(); - } catch (IOException e) { + } catch (Throwable e) { LOG.warn("Error Close Connection: " + exceptionInfo(e), e); } } diff --git a/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannel.java b/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannel.java index 02a63ba2eb..365dc64e1c 100644 --- a/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannel.java +++ b/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannel.java @@ -36,12 +36,12 @@ public void close(int timeout) throws MessagingChannelException { client.disconnect(timeout); } catch (IOException e) { throw new MessagingChannelException("Error Disconnect Channel: " + dataPointInfo(dataPointRT.getVO()) + ", " + causeInfo(e), e.getCause()); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Disconnect Channel: " + dataPointInfo(dataPointRT.getVO()) + ", " + exceptionInfo(e), e); } finally { try { client.close(); - } catch (Exception e) { + } catch (Throwable e) { LOG.warn("Error Close Channel: " + dataPointInfo(dataPointRT.getVO()) + ", " + exceptionInfo(e), e); } } @@ -54,7 +54,7 @@ public void publish(String message) throws MessagingChannelException { try { client.publish(locator.getTopicFilter(), message.getBytes(StandardCharsets.UTF_8), locator.getQos(), locator.isRetained()); - } catch (Exception ex) { + } catch (Throwable ex) { throw new RuntimeException("Error Publish: " + dataPointInfo(dataPointRT.getVO())+ ", Value: " + message + ", " + exceptionInfo(ex), ex); } } diff --git a/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java b/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java index 1060197892..3bd5825f7e 100644 --- a/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java +++ b/src/org/scada_lts/ds/messaging/protocol/mqtt/client/MqttMessagingChannels.java @@ -35,7 +35,7 @@ public void removeChannel(DataPointRT dataPoint) throws MessagingChannelExceptio channels.removeChannel(dataPoint); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Remove Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -46,18 +46,18 @@ public boolean isOpenChannel(DataPointRT dataPoint) { } @Override - public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { + public void initChannel(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { try { channels.initChannel(dataPoint, () -> { try { return new MqttMessagingChannel(createClient(dataPoint, exceptionHandler, returnToNormal), dataPoint); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Create Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + causeInfo(e), e.getCause()); } }); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Init Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -68,7 +68,7 @@ public void initChannel(DataPointRT dataPoint, Supplier create channels.initChannel(dataPoint, create); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Init Channel: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -79,7 +79,7 @@ public void publish(DataPointRT dataPoint, String message) throws MessagingChann channels.publish(dataPoint, message); } catch (MessagingChannelException e) { throw e; - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Publish: " + dataPointInfo(dataPoint.getVO()) + ", " + exceptionInfo(e), e); } } @@ -93,8 +93,8 @@ public boolean isOpenConnection() { public void closeChannels() throws MessagingChannelException { try { channels.closeChannels(); - } catch (Exception ex) { - LOG.warn("Error Close Channels: " + exceptionInfo(ex), ex); + } catch (Throwable ex) { + LOG.warn("Error Close Channels: " + dataSourceInfo(vo) + ", " + exceptionInfo(ex), ex); } } @@ -103,7 +103,7 @@ public int size() { return channels.size(); } - private MqttVClient createClient(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { + private MqttVClient createClient(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingChannelException { MqttPointLocatorRT pointLocator = dataPoint.getPointLocator(); MqttPointLocatorVO locator = pointLocator.getVO(); @@ -111,21 +111,21 @@ private MqttVClient createClient(DataPointRT dataPoint, Consumer exce try { MqttVersion mqttVersion = (MqttVersion) vo.getProtocolVersion(); client = mqttVersion.newClient(vo, locator); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Create Client: " + dataSourcePointInfo(vo, dataPoint.getVO()) + ", " + exceptionInfo(e), e); } try { client.connect(); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingChannelException("Error Connect Client: " + dataSourcePointInfo(vo, dataPoint.getVO()) + ", " + exceptionInfo(e), e); } try { client.subscribe(locator.getTopicFilter(), locator.getQos(), (topic, mqttMessage) -> new UpdatePointValueConsumer(dataPoint, locator::isWritable, exceptionHandler, returnToNormal).accept(mqttMessage.getPayload())); - } catch (Exception e) { + } catch (Throwable e) { try { close(client); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Close Client: " + dataSourcePointInfo(vo, dataPoint.getVO()) + ", " + exceptionInfo(ex), ex); } throw new MessagingChannelException("Error Subscribe Client: " + dataSourcePointInfo(vo, dataPoint.getVO()) + ", " + exceptionInfo(e), e); diff --git a/src/org/scada_lts/ds/messaging/service/MessagingService.java b/src/org/scada_lts/ds/messaging/service/MessagingService.java index 6bf68a70df..5ad44202e4 100644 --- a/src/org/scada_lts/ds/messaging/service/MessagingService.java +++ b/src/org/scada_lts/ds/messaging/service/MessagingService.java @@ -13,7 +13,7 @@ public interface MessagingService { void open() throws MessagingServiceException; void close() throws MessagingServiceException; - void initReceiver(DataPointRT dataPoint, Consumer updateExceptionHandler, Supplier returnToNormal) throws MessagingServiceException; + void initReceiver(DataPointRT dataPoint, Consumer updateExceptionHandler, Supplier returnToNormal) throws MessagingServiceException; void removeReceiver(DataPointRT dataPoint) throws MessagingServiceException; void publish(DataPointRT dataPoint, String message) throws MessagingServiceException; } diff --git a/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java b/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java index de6d0ceaf5..a1f3fbe0f1 100644 --- a/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java +++ b/src/org/scada_lts/ds/messaging/service/MessagingServiceImpl.java @@ -31,19 +31,19 @@ class MessagingServiceImpl implements MessagingService { @Override public void publish(DataPointRT dataPoint, String message) throws MessagingServiceException { if(blocked) { - throw new MessagingServiceException("Stop Publish: " + dataSourceInfo(vo) + ", Service of shutting down: " + dataSourceInfo(vo) + ", Value: " + message); + throw new MessagingServiceException("Stop Publish: " + dataPointInfo(dataPoint) + ", Service of shutting down: " + dataSourceInfo(vo) + ", Value: " + message); } try { channels.publish(dataPoint, message); - } catch (Exception e) { - throw new MessagingServiceException("Error Publish: " + dataSourceInfo(vo) + ", Value: " + message + ", " + exceptionInfo(e), e); + } catch (Throwable e) { + throw new MessagingServiceException("Error Publish: " + dataPointInfo(dataPoint) + ", Value: " + message + ", " + exceptionInfo(e), e); } } @Override - public void initReceiver(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingServiceException { + public void initReceiver(DataPointRT dataPoint, Consumer exceptionHandler, Supplier returnToNormal) throws MessagingServiceException { if(blocked) { - LOG.warn("Stop Init Receiver: " + dataSourceInfo(vo) + ", Service of shutting down: " + dataSourceInfo(vo)); + LOG.warn("Stop Init Receiver: " + dataPointInfo(dataPoint) + ", Service of shutting down: " + dataSourceInfo(vo)); return; } if(isOpen(dataPoint)) { @@ -51,7 +51,7 @@ public void initReceiver(DataPointRT dataPoint, Consumer exceptionHan } try { channels.initChannel(dataPoint, exceptionHandler, returnToNormal); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingServiceException("Error Init Receiver: " + dataSourceInfo(vo) + ", " + exceptionInfo(e), e); } } @@ -59,12 +59,12 @@ public void initReceiver(DataPointRT dataPoint, Consumer exceptionHan @Override public void removeReceiver(DataPointRT dataPoint) throws MessagingServiceException { if(blocked) { - LOG.warn("Stop Remove Receiver: " + dataSourceInfo(vo) + ", Service of shutting down: " + dataSourceInfo(vo)); + LOG.warn("Stop Remove Receiver: " + dataPointInfo(dataPoint) + ", Service of shutting down: " + dataSourceInfo(vo)); return; } try { channels.removeChannel(dataPoint); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingServiceException("Error Remove Receiver: " + dataSourceInfo(vo) + ", " + exceptionInfo(e), e); } } @@ -81,16 +81,14 @@ public boolean isOpen(DataPointRT dataPoint) { @Override public void open() throws MessagingServiceException { - if(blocked) { - throw new MessagingServiceException("Stop Open Connection: Service of shutting down: " + dataSourceInfo(vo)); - } if(channels.isOpenConnection()) { + blocked = false; LOG.warn("Stop Open Connection: Connection is opened: " + dataSourceInfo(vo)); return; } try { channels.openConnection(); - } catch (Exception e) { + } catch (Throwable e) { throw new MessagingServiceException("Error Open Connection: " + dataSourceInfo(vo) + ", " + exceptionInfo(e), e); } blocked = false; @@ -101,7 +99,7 @@ public void close() throws MessagingServiceException { blocked = true; try { channels.closeChannels(); - } catch (Exception ex) { + } catch (Throwable ex) { LOG.warn("Error Close Receivers: " + dataSourceInfo(vo) + ", " + exceptionInfo(ex), ex); } } diff --git a/src/org/scada_lts/serial/gnu/io/ScadaCommPortIdentifier.java b/src/org/scada_lts/serial/gnu/io/ScadaCommPortIdentifier.java new file mode 100644 index 0000000000..3876e196ce --- /dev/null +++ b/src/org/scada_lts/serial/gnu/io/ScadaCommPortIdentifier.java @@ -0,0 +1,11 @@ +package org.scada_lts.serial.gnu.io; + + +import java.util.Enumeration; + +public class ScadaCommPortIdentifier { + + public static Enumeration getPortIdentifiers() { + return gnu.io.CommPortIdentifier.getPortIdentifiers(); + } +} diff --git a/test/br/org/scadabr/db/utils/TestUtils.java b/test/br/org/scadabr/db/utils/TestUtils.java index 35aaf64ebd..d9b8a846e6 100644 --- a/test/br/org/scadabr/db/utils/TestUtils.java +++ b/test/br/org/scadabr/db/utils/TestUtils.java @@ -1,18 +1,15 @@ package br.org.scadabr.db.utils; import java.util.ArrayList; -import java.util.Random; import com.serotonin.mango.db.dao.UserDao; import com.serotonin.mango.vo.DataPointVO; import com.serotonin.mango.vo.User; import com.serotonin.mango.vo.dataSource.DataSourceVO; import com.serotonin.mango.vo.dataSource.PointLocatorVO; -import com.serotonin.mango.vo.dataSource.viconics.ViconicsPointLocatorVO; import com.serotonin.mango.vo.dataSource.virtual.VirtualDataSourceVO; import com.serotonin.mango.vo.dataSource.virtual.VirtualPointLocatorVO; import com.serotonin.mango.vo.permission.DataPointAccess; -import org.scada_lts.dao.model.pointhierarchy.PointHierarchyNode; public class TestUtils { @@ -27,8 +24,8 @@ public static User createUser() { user.setHomeUrl("url"); user.setReceiveAlarmEmails(1); user.setReceiveOwnAuditEvents(true); - user.setDataSourcePermissions(new ArrayList()); - user.setDataPointPermissions(new ArrayList()); + user.setDataSourcePermissions(new ArrayList<>()); + user.setDataPointPermissions(new ArrayList<>()); new UserDao().saveUser(user); return user; @@ -46,8 +43,8 @@ public static User newUser(int id) { user.setHomeUrl("url"); user.setReceiveAlarmEmails(1); user.setReceiveOwnAuditEvents(true); - user.setDataSourcePermissions(new ArrayList()); - user.setDataPointPermissions(new ArrayList()); + user.setDataSourcePermissions(new ArrayList<>()); + user.setDataPointPermissions(new ArrayList<>()); return user; } @@ -64,6 +61,7 @@ public static DataPointVO newPointSettable(int id, int folderId) { VirtualPointLocatorVO pointLocatorVO = new VirtualPointLocatorVO(); pointLocatorVO.setSettable(true); dataPoint1.setPointLocator(pointLocatorVO); + dataPoint1.setEventDetectors(new ArrayList<>()); return dataPoint1; } @@ -80,6 +78,23 @@ public static DataPointVO newPointSettable(int id, DataSourceVO dataSource, i VirtualPointLocatorVO pointLocatorVO = new VirtualPointLocatorVO(); pointLocatorVO.setSettable(true); dataPoint1.setPointLocator(pointLocatorVO); + dataPoint1.setEventDetectors(new ArrayList<>()); + return dataPoint1; + } + + public static DataPointVO newPointSettable(int id, DataSourceVO dataSource, + int folderId, PointLocatorVO metaPointLocatorVO) { + DataPointVO dataPoint1 = new DataPointVO(DataPointVO.LoggingTypes.ON_CHANGE); + dataPoint1.setId(id); + dataPoint1.setXid("DP_" + id); + dataPoint1.setName("dp_" + id); + dataPoint1.setDataSourceId(dataSource.getId()); + dataPoint1.setDataSourceName(dataSource.getName()); + dataPoint1.setDataSourceTypeId(dataSource.getType().getId()); + dataPoint1.setDataSourceXid(dataSource.getXid()); + dataPoint1.setPointFolderId(folderId); + dataPoint1.setPointLocator(metaPointLocatorVO); + dataPoint1.setEventDetectors(new ArrayList<>()); return dataPoint1; } @@ -96,6 +111,7 @@ public static DataPointVO newPointNonSettable(int id, DataSourceVO dataSource VirtualPointLocatorVO pointLocatorVO = new VirtualPointLocatorVO(); pointLocatorVO.setSettable(false); dataPoint1.setPointLocator(pointLocatorVO); + dataPoint1.setEventDetectors(new ArrayList<>()); return dataPoint1; } diff --git a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java index 58540123e8..e1f052c28e 100644 --- a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java +++ b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java @@ -3,16 +3,20 @@ import br.org.scadabr.db.utils.TestUtils; import com.serotonin.db.IntValuePair; import com.serotonin.mango.Common; +import com.serotonin.mango.db.dao.DataPointDao; +import com.serotonin.mango.db.dao.PointValueDao; +import com.serotonin.mango.rt.EventManager; import com.serotonin.mango.rt.RuntimeManager; import com.serotonin.mango.rt.dataImage.DataPointRT; import com.serotonin.mango.rt.dataImage.PointValueCache; -import com.serotonin.mango.rt.dataImage.types.MangoValue; -import com.serotonin.mango.rt.dataSource.meta.MetaPointLocatorRT; -import com.serotonin.mango.vo.User; -import com.serotonin.mango.rt.dataSource.virtual.VirtualPointLocatorRT; +import com.serotonin.mango.rt.maint.BackgroundProcessing; +import com.serotonin.mango.vo.DataPointVO; +import com.serotonin.mango.vo.TimePeriodType; +import com.serotonin.mango.vo.dataSource.meta.MetaDataSourceVO; import com.serotonin.mango.vo.dataSource.meta.MetaPointLocatorVO; -import com.serotonin.mango.vo.dataSource.virtual.ChangeTypeVO; -import com.serotonin.mango.vo.dataSource.virtual.NoChangeVO; +import com.serotonin.mango.vo.dataSource.virtual.VirtualDataSourceVO; +import com.serotonin.mango.vo.dataSource.virtual.VirtualPointLocatorVO; +import com.serotonin.mango.web.ContextWrapper; import com.serotonin.mango.web.dwr.MiscDwr; import com.serotonin.web.content.ContentGenerator; import org.directwebremoting.WebContextFactory; @@ -24,194 +28,539 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.scada_lts.dao.SystemSettingsDAO; -import utils.mock.MockUtils; +import org.scada_lts.mango.service.DataPointService; +import org.scada_lts.mango.service.DataSourceService; +import org.scada_lts.mango.service.PointValueService; +import org.scada_lts.mango.service.SystemSettingsService; +import org.scada_lts.web.beans.ApplicationBeans; +import org.scada_lts.web.ws.services.DataPointServiceWebSocket; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; -import static org.mockito.ArgumentMatchers.*; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoints; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.reset; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.set; +import static org.mockito.ArgumentMatchers.anyString; import static org.powermock.api.mockito.PowerMockito.*; @RunWith(PowerMockRunner.class) @PrepareForTest({WebContextFactory.class, Common.class, MiscDwr.class, SystemSettingsDAO.class, - ContentGenerator.class, PointValueCache.class, DataPointRT.class}) + ContentGenerator.class, PointValueCache.class, DataPointRT.class, RuntimeManager.class, DataPointDao.class, + PointValueDao.class, ApplicationBeans.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class DataPointUnreliableUtilsTest { - private List metaDataPoints; + private RuntimeManager runtimeManager; + + private DataPointVO metaDataPoint1; + private DataPointVO metaDataPoint2; + + private DataPointVO metaDataPoint6WithVirtualDataPoint1; + private DataPointVO metaDataPoint7WithVirtualDataPoint1; + private DataPointVO metaDataPoint8; + private DataPointVO metaDataPoint9WithVirtualDataPoint2; + private DataPointVO metaDataPoint10WithVirtualDataPoint1; + + private DataPointVO virtualDataPoint1; + private DataPointVO virtualDataPoint2; + + private MetaDataSourceVO metaDataSourceVO1; + private MetaDataSourceVO metaDataSourceVO2; + private VirtualDataSourceVO virtualDataSourceVO; + + private final List metaDataPoints = new ArrayList<>(); + private final List metaDataPointsWithContext = new ArrayList<>(); + private final List virtualDataPoints = new ArrayList<>(); @Before - public void config() throws Exception { - RuntimeManager runtimeManager = mock(RuntimeManager.class); - metaDataPoints = new ArrayList<>(); - when(runtimeManager.getRunningMetaDataPoints(anyInt())).thenReturn(metaDataPoints); - MockUtils.configMock(runtimeManager, new User()); - PointValueCache pointValueCache = mock(PointValueCache.class); - whenNew(PointValueCache.class) - .withArguments(anyInt(), anyInt()) - .thenReturn(pointValueCache); + public void configMock() throws Exception { + + DataSourceService dataSourceService = mock(DataSourceService.class); + whenNew(DataSourceService.class).withNoArguments().thenReturn(dataSourceService); + + DataPointService dataPointService = mock(DataPointService.class); + whenNew(DataPointService.class).withNoArguments().thenReturn(dataPointService); + + SystemSettingsService systemSettingsService = mock(SystemSettingsService.class); + whenNew(SystemSettingsService.class).withNoArguments().thenReturn(systemSettingsService); + + SystemSettingsDAO systemSettingsDAO = mock(SystemSettingsDAO.class); + whenNew(SystemSettingsDAO.class).withNoArguments().thenReturn(systemSettingsDAO); + + mockStatic(SystemSettingsDAO.class); + when(SystemSettingsDAO.getValue(anyString())).thenReturn(""); + when(SystemSettingsDAO.getFutureDateLimit()).thenReturn(1L); + + PointValueService mangoPointValues = mock(PointValueService.class); + whenNew(PointValueService.class).withNoArguments().thenReturn(mangoPointValues); + + mockStatic(ApplicationBeans.class); + DataPointServiceWebSocket dataPointServiceWebSocket = mock(DataPointServiceWebSocket.class); + when(ApplicationBeans.getDataPointServiceWebSocketBean()).thenReturn(dataPointServiceWebSocket); + + ContextWrapper contextWrapper = mock(ContextWrapper.class); + EventManager eventManager = mock(EventManager.class); + BackgroundProcessing backgroundProcessing = mock(BackgroundProcessing.class); - MetaPointLocatorVO metaPointLocatorVO = new MetaPointLocatorVO(); - metaPointLocatorVO.setContext(Arrays.asList(new IntValuePair(11, ""))); - MetaPointLocatorRT metaPointLocatorRT = new MetaPointLocatorRT(metaPointLocatorVO); + runtimeManager = new RuntimeManager(); + when(contextWrapper.getRuntimeManager()).thenReturn(runtimeManager); + when(contextWrapper.getEventManager()).thenReturn(eventManager); + when(contextWrapper.getBackgroundProcessing()).thenReturn(backgroundProcessing); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(111,-1), metaPointLocatorRT); - DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(112,-1), new MetaPointLocatorRT(new MetaPointLocatorVO())); - DataPointRT dataPointRT3 = new DataPointRT(TestUtils.newPointSettable(113,-1), new MetaPointLocatorRT(new MetaPointLocatorVO())); - metaDataPoints.addAll(Arrays.asList(dataPointRT1, dataPointRT2, dataPointRT3)); + Common.ctx = contextWrapper; + Common.timer.init(); + + configData(); } + private void configData() { + + metaDataSourceVO1 = new MetaDataSourceVO(); + metaDataSourceVO1.setId(123); + metaDataSourceVO1.setEnabled(true); + metaDataSourceVO1.setXid("TEST_DS_XID1"); + metaDataSourceVO1.setName("Meta_Test1"); + + metaDataSourceVO2 = new MetaDataSourceVO(); + metaDataSourceVO2.setId(345); + metaDataSourceVO2.setEnabled(true); + metaDataSourceVO2.setXid("TEST_DS_XID2"); + metaDataSourceVO2.setName("Meta_Test2"); + + virtualDataSourceVO = new VirtualDataSourceVO(); + virtualDataSourceVO.setEnabled(true); + virtualDataSourceVO.setId(567); + virtualDataSourceVO.setXid("TEST_DS_XID3"); + virtualDataSourceVO.setName("Virtual_Test"); + virtualDataSourceVO.setUpdatePeriods(1); + virtualDataSourceVO.setUpdatePeriodType(TimePeriodType.SECONDS.getCode()); + + + metaDataPoint1 = TestUtils.newPointSettable(111, metaDataSourceVO1, -1, new MetaPointLocatorVO()); + metaDataPoint1.setEnabled(true); + + metaDataPoint2 = TestUtils.newPointSettable(112, metaDataSourceVO1, -1, new MetaPointLocatorVO()); + metaDataPoint2.setEnabled(true); + + MetaPointLocatorVO metaPointLocatorVO1 = new MetaPointLocatorVO(); + metaPointLocatorVO1.setContext(Arrays.asList(new IntValuePair(117,""), new IntValuePair(121,""))); + metaDataPoint6WithVirtualDataPoint1 = TestUtils.newPointSettable(116, metaDataSourceVO2, -1, metaPointLocatorVO1); + metaDataPoint6WithVirtualDataPoint1.setEnabled(true); + + MetaPointLocatorVO metaPointLocatorVO2 = new MetaPointLocatorVO(); + metaPointLocatorVO2.setContext(Arrays.asList(new IntValuePair(118,""), new IntValuePair(121,""))); + metaDataPoint7WithVirtualDataPoint1 = TestUtils.newPointSettable(117, metaDataSourceVO2, -1, metaPointLocatorVO2); + metaDataPoint7WithVirtualDataPoint1.setEnabled(true); + + MetaPointLocatorVO metaPointLocatorVO3 = new MetaPointLocatorVO(); + metaPointLocatorVO3.setContext(Arrays.asList(new IntValuePair(119,""))); + metaDataPoint8 = TestUtils.newPointSettable(118, metaDataSourceVO2, -1, metaPointLocatorVO3); + metaDataPoint8.setEnabled(true); + + MetaPointLocatorVO metaPointLocatorVO4 = new MetaPointLocatorVO(); + metaPointLocatorVO4.setContext(Arrays.asList(new IntValuePair(120,""), new IntValuePair(122,""))); + metaDataPoint9WithVirtualDataPoint2 = TestUtils.newPointSettable(119, metaDataSourceVO2, -1, metaPointLocatorVO4); + metaDataPoint9WithVirtualDataPoint2.setEnabled(true); + + MetaPointLocatorVO metaPointLocatorVO5 = new MetaPointLocatorVO(); + metaPointLocatorVO5.setContext(Arrays.asList(new IntValuePair(118,""), new IntValuePair(121,""))); + metaDataPoint10WithVirtualDataPoint1 = TestUtils.newPointSettable(120, metaDataSourceVO2, -1, metaPointLocatorVO5); + metaDataPoint10WithVirtualDataPoint1.setEnabled(true); + + virtualDataPoint1 = TestUtils.newPointSettable(121, virtualDataSourceVO, -1, new VirtualPointLocatorVO()); + virtualDataPoint1.setEnabled(true); + + virtualDataPoint2 = TestUtils.newPointSettable(122, virtualDataSourceVO, -1, new VirtualPointLocatorVO()); + virtualDataPoint2.setEnabled(true); + + + runtimeManager.saveDataSource(metaDataSourceVO1); + runtimeManager.saveDataPoint(metaDataPoint1); + runtimeManager.saveDataPoint(metaDataPoint2); + + runtimeManager.saveDataSource(metaDataSourceVO2); + runtimeManager.saveDataPoint(metaDataPoint8); + runtimeManager.saveDataPoint(metaDataPoint6WithVirtualDataPoint1); + runtimeManager.saveDataPoint(metaDataPoint7WithVirtualDataPoint1); + runtimeManager.saveDataPoint(metaDataPoint9WithVirtualDataPoint2); + runtimeManager.saveDataPoint(metaDataPoint10WithVirtualDataPoint1); + + runtimeManager.saveDataSource(virtualDataSourceVO); + runtimeManager.saveDataPoint(virtualDataPoint1); + runtimeManager.saveDataPoint(virtualDataPoint2); + + + virtualDataPoints.add(runtimeManager.getDataPoint(virtualDataPoint1.getId())); + virtualDataPoints.add(runtimeManager.getDataPoint(virtualDataPoint2.getId())); + + metaDataPoints.add(runtimeManager.getDataPoint(metaDataPoint1.getId())); + metaDataPoints.add(runtimeManager.getDataPoint(metaDataPoint2.getId())); + + metaDataPointsWithContext.add(runtimeManager.getDataPoint(metaDataPoint6WithVirtualDataPoint1.getId())); + metaDataPointsWithContext.add(runtimeManager.getDataPoint(metaDataPoint7WithVirtualDataPoint1.getId())); + metaDataPointsWithContext.add(runtimeManager.getDataPoint(metaDataPoint8.getId())); + metaDataPointsWithContext.add(runtimeManager.getDataPoint(metaDataPoint9WithVirtualDataPoint2.getId())); + metaDataPointsWithContext.add(runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId())); + + } + + @Test + public void when_setUnreliableDataPoints_with_virtual_points_then_unreliable_true() { + + //given: + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + + //when: + setUnreliableDataPoints(virtualDataPoints); + + //then: + for(DataPointRT dataPoint: virtualDataPoints) { + Assert.assertEquals(true, dataPoint.isUnreliable()); + } + } + + @Test + public void when_setUnreliableDataPoints_with_meta_points_then_unreliable_true() { + + //given: + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + + //when: + setUnreliableDataPoints(metaDataPoints); + + //then: + for(DataPointRT dataPoint: metaDataPoints) { + Assert.assertEquals(true, dataPoint.isUnreliable()); + } + } + + @Test + public void when_setUnreliableDataPoints_with_meta_points_with_context_then_unreliable_true() { + + //given: + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + + //when: + setUnreliableDataPoints(metaDataPointsWithContext); + + //then: + for(DataPointRT dataPoint: metaDataPointsWithContext) { + Assert.assertEquals(true, dataPoint.isUnreliable()); + } + } + + @Test + public void when_getRunningDataSource_virtual_data_source_then_initialized_true() { + + //when: + DataSourceRT dataSourceRT = runtimeManager.getRunningDataSource(virtualDataSourceVO.getId()); + + //then: + Assert.assertEquals(true, dataSourceRT.isInitialized()); + + } + + @Test + public void when_getRunningDataSource_meta_data_source_then_initialized_true() { + + //when: + DataSourceRT dataSourceRT = runtimeManager.getRunningDataSource(metaDataSourceVO1.getId()); + + //then: + Assert.assertEquals(true, dataSourceRT.isInitialized()); + + } + + @Test + public void when_getRunningDataSource_meta_data_source_with_context_then_initialized_true() { + + //when: + DataSourceRT dataSourceRT = runtimeManager.getRunningDataSource(metaDataSourceVO2.getId()); + + //then: + Assert.assertEquals(true, dataSourceRT.isInitialized()); + + } + + @Test + public void when_setUnreliableDataPoint_with_virtual_point_then_unreliable_true() { + + //given: + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); + + //when: + setUnreliableDataPoint(dataPointRT); + + //then: + Assert.assertEquals(true, dataPointRT.isUnreliable()); + + } @Test - public void when_setUnreliableDataPoint_with_point_then_unreliable() { + public void when_setUnreliableDataPoint_with_meta_point_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); //when: - setUnreliableDataPoint(dataPointRT1); + setUnreliableDataPoint(dataPointRT); //then: - Assert.assertEquals(true, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + Assert.assertEquals(true, dataPointRT.isUnreliable()); + } @Test - public void when_setUnreliableDataPoints_with_points_then_unreliable() { + public void when_setUnreliableDataPoint_with_meta_point_with_context_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint6WithVirtualDataPoint1.getId()); //when: - setUnreliableDataPoints(dataPoints); + setUnreliableDataPoint(dataPointRT); //then: - Assert.assertEquals(true, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); - Assert.assertEquals(true, dataPointRT2.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + Assert.assertEquals(true, dataPointRT.isUnreliable()); + } @Test - public void when_resetUnreliableDataPoints_with_point_then_reliable() { + public void when_setUnreliableDataPoints_with_virtual_points_then_meta_points_unreliable_false() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: - resetUnreliableDataPoint(dataPointRT1); + setUnreliableDataPoints(virtualDataPoints); //then: - Assert.assertEquals(false, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + for(DataPointRT dataPoint: metaDataPoints) { + Assert.assertEquals(false, dataPoint.isUnreliable()); + } } @Test - public void when_resetUnreliableDataPoints_with_points_then_reliable() { + public void when_setUnreliableDataPoints_with_virtual_points_from_meta_points_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: - resetUnreliableDataPoints(dataPoints); + setUnreliableDataPoints(virtualDataPoints); //then: - Assert.assertEquals(false, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); - Assert.assertEquals(false, dataPointRT2.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + for(DataPointRT dataPoint: metaDataPointsWithContext) { + Assert.assertEquals(true, dataPoint.isUnreliable()); + } } - /// + @Test + public void when_setUnreliableDataPoint_with_meta_point_from_context_meta_points_then_unreliable_true() { + + //given: + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); + + //when: + setUnreliableDataPoint(dataPointRT); + + //then: + for(DataPointRT dataPoint: metaDataPointsWithContext) { + Assert.assertEquals(true, dataPoint.isUnreliable()); + } + } @Test - public void when_setUnreliableDataPoint_with_point_then_meta_points_unreliable() { + public void when_setUnreliableDataPoint_with_meta_point_from_context_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); //when: - setUnreliableDataPoint(dataPointRT1); + setUnreliableDataPoint(dataPointRT); //then: - for(DataPointRT dataPointRT: metaDataPoints) { - Assert.assertEquals(true, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + for(DataPointRT dataPoint: runtimeManager.getRunningMetaDataPoints(dataPointRT.getId())) { + Assert.assertEquals(true, dataPoint.isUnreliable()); } } @Test - public void when_setUnreliableDataPoints_with_points_then_meta_points_unreliable() { + public void when_setUnreliableDataPoints_with_virtual_points_from_context_meta_points_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: - setUnreliableDataPoints(dataPoints); + setUnreliableDataPoints(virtualDataPoints); //then: - for(DataPointRT dataPointRT: metaDataPoints) { - Assert.assertEquals(true, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + for(DataPointRT dataPoint: metaDataPointsWithContext) { + Assert.assertEquals(true, dataPoint.isUnreliable()); } } @Test - public void when_resetUnreliableDataPoints_with_point_then_meta_points_reliable() { + public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_points_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); //when: - resetUnreliableDataPoint(dataPointRT1); + setUnreliableDataPoint(dataPointRT); //then: - for(DataPointRT dataPointRT: metaDataPoints) { - Assert.assertEquals(false, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + for(DataPointRT dataPoint: runtimeManager.getRunningMetaDataPoints(dataPointRT.getId())) { + Assert.assertEquals(true, dataPoint.isUnreliable()); } } @Test - public void when_resetUnreliableDataPoints_with_points_then_meta_points_reliable() { + public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_point_then_unreliable_true() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - DataPointRT dataPointRT2 = new DataPointRT(TestUtils.newPointSettable(109,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); - List dataPoints = Arrays.asList(dataPointRT1, dataPointRT2); + reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint2.getId()); + DataPointRT metaDataPointRT = runtimeManager.getDataPoint(metaDataPoint9WithVirtualDataPoint2.getId()); //when: - resetUnreliableDataPoints(dataPoints); + setUnreliableDataPoint(dataPointRT); //then: - for(DataPointRT dataPointRT: metaDataPoints) { - Assert.assertEquals(false, dataPointRT.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY)); + Assert.assertEquals(true, metaDataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoint_with_virtual_point_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + Assert.assertEquals(false, dataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoint_with_meta_point_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + Assert.assertEquals(false, dataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoint_with_meta_point_with_context_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint6WithVirtualDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + Assert.assertEquals(false, dataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoint_with_meta_point_from_context_meta_point_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + for(DataPointRT dataPoint: metaDataPointsWithContext) { + Assert.assertEquals(false, dataPoint.isUnreliable()); } } - /// + @Test + public void when_resetUnreliableDataPoints_with_meta_point_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + Assert.assertEquals(false, dataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoints_with_meta_points_then_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); + + //when: + resetUnreliableDataPoints(metaDataPoints); + + //then: + Assert.assertEquals(false, dataPointRT.isUnreliable()); + + } + + @Test + public void when_resetUnreliableDataPoints_with_virtual_point_from_context_meta_point_then_meta_points_unreliable_false() { + + //given: + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); + + //then: + for(DataPointRT dataPoint: runtimeManager.getRunningMetaDataPoints(dataPointRT.getId())) { + Assert.assertEquals(false, dataPoint.isUnreliable()); + } + } @Test - public void when_not_invoke_setUnreliableDataPoints_or_setUnreliableDataPoint_then_false() { + public void when_resetUnreliableDataPoints_with_virtual_point_from_context_meta_point_then_meta_point_unreliable_false() { + //given: - ChangeTypeVO changeTypeVO = new NoChangeVO(); - DataPointRT dataPointRT1 = new DataPointRT(TestUtils.newPointSettable(110,-1), - new VirtualPointLocatorRT(changeTypeVO.createRuntime(), MangoValue.objectToValue(1), true)); + set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint2.getId()); + DataPointRT metaDataPointRT = runtimeManager.getDataPoint(metaDataPoint9WithVirtualDataPoint2.getId()); + + //when: + resetUnreliableDataPoint(dataPointRT); //then: - Assert.assertEquals(false, dataPointRT1.getAttribute(DataPointUnreliableUtils.ATTR_UNRELIABLE_KEY) != null); + Assert.assertEquals(false, metaDataPointRT.isUnreliable()); + } } \ No newline at end of file diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java new file mode 100644 index 0000000000..c8cea6f337 --- /dev/null +++ b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java @@ -0,0 +1,241 @@ +package com.serotonin.mango.rt.dataSource; + +import br.org.scadabr.rt.dataSource.alpha2.Alpha2DataSource; +import br.org.scadabr.rt.dataSource.asciiFile.ASCIIFileDataSource; +import br.org.scadabr.rt.dataSource.asciiSerial.ASCIISerialDataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3IpDataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3SerialDataSource; +import br.org.scadabr.rt.dataSource.drStorageHt5b.DrStorageHt5bDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101EthernetDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101SerialDataSource; +import br.org.scadabr.rt.dataSource.nodaves7.NodaveS7DataSource; +import br.org.scadabr.rt.dataSource.opc.OPCDataSource; +import br.org.scadabr.vo.dataSource.asciiFile.ASCIIFileDataSourceVO; +import br.org.scadabr.vo.dataSource.nodaves7.NodaveS7DataSourceVO; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoEventDataSource; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoPollingDataSource; +import com.i2msolucoes.alpha24j.layer.user.Alpha2Master; +import com.serotonin.mango.Common; +import com.serotonin.mango.rt.EventManager; +import com.serotonin.mango.rt.dataSource.bacnet.BACnetIPDataSourceRT; +import com.serotonin.mango.rt.dataSource.ebro.EBI25Constants; +import com.serotonin.mango.rt.dataSource.ebro.EBI25DataSourceRT; +import com.serotonin.mango.rt.dataSource.galil.GalilDataSourceRT; +import com.serotonin.mango.rt.dataSource.http.*; +import com.serotonin.mango.rt.dataSource.internal.InternalDataSourceRT; +import com.serotonin.mango.rt.dataSource.jmx.JmxDataSourceRT; +import com.serotonin.mango.rt.dataSource.mbus.MBusDataSourceRT; +import com.serotonin.mango.rt.dataSource.meta.MetaDataSourceRT; +import com.serotonin.mango.rt.dataSource.modbus.ModbusIpDataSource; +import com.serotonin.mango.rt.dataSource.modbus.ModbusSerialDataSource; +import com.serotonin.mango.rt.dataSource.nmea.NmeaDataSourceRT; +import com.serotonin.mango.rt.dataSource.onewire.OneWireDataSourceRT; +import com.serotonin.mango.rt.dataSource.openv4j.OpenV4JDataSourceRT; +import com.serotonin.mango.rt.dataSource.pachube.PachubeDataSourceRT; +import com.serotonin.mango.rt.dataSource.persistent.PersistentDataSourceRT; +import com.serotonin.mango.rt.dataSource.pop3.Pop3DataSourceRT; +import com.serotonin.mango.rt.dataSource.snmp.SnmpDataSourceRT; +import com.serotonin.mango.rt.dataSource.sql.SqlDataSourceRT; +import com.serotonin.mango.rt.dataSource.viconics.ViconicsDataSourceRT; +import com.serotonin.mango.rt.dataSource.virtual.VirtualDataSourceRT; +import com.serotonin.mango.rt.dataSource.vmstat.VMStatDataSourceRT; +import com.serotonin.mango.util.InitializeDataSourceRtMockUtils; +import com.serotonin.mango.util.SqlDataSourceUtils; +import com.serotonin.mango.vo.dataSource.http.HttpImageDataSourceVO; +import com.serotonin.mango.vo.dataSource.http.HttpRetrieverDataSourceVO; +import com.serotonin.mango.vo.dataSource.internal.InternalDataSourceVO; +import com.serotonin.mango.vo.dataSource.jmx.JmxDataSourceVO; +import com.serotonin.mango.vo.dataSource.mbus.MBusDataSourceVO; +import com.serotonin.mango.vo.dataSource.meta.MetaDataSourceVO; +import com.serotonin.mango.vo.dataSource.openv4j.OpenV4JDataSourceVO; +import com.serotonin.mango.vo.dataSource.persistent.PersistentDataSourceVO; +import com.serotonin.mango.vo.dataSource.pop3.Pop3DataSourceVO; +import com.serotonin.mango.vo.dataSource.virtual.VirtualDataSourceVO; +import com.serotonin.mango.vo.dataSource.vmstat.VMStatDataSourceVO; +import com.serotonin.mango.web.ContextWrapper; +import com.serotonin.modbus4j.ModbusFactory; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.scada_lts.ds.messaging.protocol.amqp.AmqpDataSourceVO; +import org.scada_lts.ds.messaging.protocol.mqtt.MqttDataSourceVO; +import org.scada_lts.serial.gnu.io.ScadaCommPortIdentifier; + +import org.springframework.security.web.savedrequest.Enumerator; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.function.Supplier; + +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.wrap; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(Parameterized.class) +@PrepareForTest({Common.class, ASCIISerialDataSource.class, ScadaCommPortIdentifier.class, Alpha2DataSource.class, + Alpha2Master.class, BACnetIPDataSourceRT.class, Dnp3IpDataSource.class, Dnp3SerialDataSource.class, + EBI25DataSourceRT.class, EBI25Constants.class, NmeaDataSourceRT.class, Runtime.class, VMStatDataSourceRT.class, + ViconicsDataSourceRT.class, GalilDataSourceRT.class, IEC101EthernetDataSource.class, IEC101SerialDataSource.class, + ModbusFactory.class, OPCDataSource.class, OneWireDataSourceRT.class, SqlDataSourceUtils.class}) +@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", + "javax.activation.*", "javax.management.*"}) +public class InitializeDataSourceRtTest { + + @Parameterized.Parameters(name = "{index}: data source: {0}, raiseEventTimes: {2}, returnToNormalTimes: {3}") + public static Object[][] data() throws Exception { + + return new Object[][] { + + {ASCIISerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAsciiSerial), 1, 0}, + {Alpha2DataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAlpha2), 1, 0}, + {BACnetIPDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createBacNet), 3, 0}, + {Dnp3IpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDnp3Ip), 1, 0}, + {Dnp3SerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDnp3Serial), 1, 0}, + {DrStorageHt5bDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDrStorageMock), 1, 0}, + {EBI25DataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createEbi25), 1, 0}, + {NmeaDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createNmea), 1, 0}, + {RadiuinoEventDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createRadiuino), 1, 0}, + {RadiuinoPollingDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createRadiuinoPolling), 1, 0}, + {VMStatDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtTest::createVmStat), 1, 0}, + {ViconicsDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createViconics), 1, 0}, + {GalilDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createGalil), 1, 0}, + {IEC101EthernetDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createIec101Ethernet), 1, 0}, + {IEC101SerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createIec101Serial), 1, 0}, + {AmqpDataSourceVO.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAmqp), 1, 0}, + {MqttDataSourceVO.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createMqtt), 1, 0}, + {ModbusIpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, + {ModbusSerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, + {OPCDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createOpc), 1, 0}, + {OneWireDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createOneWire), 1, 0}, + {SqlDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSql), 1, 0}, + {HttpReceiverDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSql), 1, 0}, + {PachubeDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createPachube), 1, 0}, + {SnmpDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSnmp), 1, 0}, + {PersistentDataSourceRT.class.getSimpleName(), wrap(() -> new PersistentDataSourceRT(new PersistentDataSourceVO())), 1, 0}, + {ModbusIpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, + {ModbusSerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, + + + {VirtualDataSourceRT.class.getSimpleName(), wrap(() -> new VirtualDataSourceRT(new VirtualDataSourceVO())), 0, 0}, + {ASCIIFileDataSource.class.getSimpleName(), wrap(() -> new ASCIIFileDataSource(new ASCIIFileDataSourceVO<>())), 0, 0}, + {HttpImageDataSourceRT.class.getSimpleName(), wrap(() -> new HttpImageDataSourceRT(new HttpImageDataSourceVO())), 0, 0}, + {HttpRetrieverDataSourceRT.class.getSimpleName(), wrap(() -> new HttpRetrieverDataSourceRT(new HttpRetrieverDataSourceVO())), 0, 0}, + {InternalDataSourceRT.class.getSimpleName(), wrap(() -> new InternalDataSourceRT(new InternalDataSourceVO())), 0, 0}, + {JmxDataSourceRT.class.getSimpleName(), wrap(() -> new JmxDataSourceRT(new JmxDataSourceVO())), 0, 0}, + {MBusDataSourceRT.class.getSimpleName(), wrap(() -> new MBusDataSourceRT(new MBusDataSourceVO())), 0, 0}, + {MetaDataSourceRT.class.getSimpleName(), wrap(() -> new MetaDataSourceRT(new MetaDataSourceVO())), 0, 0}, + {NodaveS7DataSource.class.getSimpleName(), wrap(() -> new NodaveS7DataSource(new NodaveS7DataSourceVO<>())), 0, 0}, + {OpenV4JDataSourceRT.class.getSimpleName(), wrap(() -> new OpenV4JDataSourceRT(new OpenV4JDataSourceVO())), 0, 0}, + {Pop3DataSourceRT.class.getSimpleName(), wrap(() -> new Pop3DataSourceRT(new Pop3DataSourceVO())), 0, 0}, + + }; + } + + private DataSourceRT dataSourceRT; + private final int raiseEventTimes; + private final int returnToNormalTimes; + private final Supplier mockConfig; + + public InitializeDataSourceRtTest(String name, Supplier mockConfig, int raiseEventTimes, int returnToNormalTimes) { + this.raiseEventTimes = raiseEventTimes; + this.returnToNormalTimes = returnToNormalTimes; + this.mockConfig = mockConfig; + } + + private EventManager eventManager; + + @Before + public void config() throws Exception { + eventManager = mock(EventManager.class); + HttpReceiverMulticaster multicastListener = mock(HttpReceiverMulticaster.class); + + ContextWrapper contextWrapper = mock(ContextWrapper.class); + when(contextWrapper.getEventManager()).thenReturn(eventManager); + when(contextWrapper.getHttpReceiverMulticaster()).thenReturn(multicastListener); + + Common.ctx = contextWrapper; + + PowerMockito.mockStatic(ScadaCommPortIdentifier.class); + when(ScadaCommPortIdentifier.getPortIdentifiers()).thenReturn(new Enumerator(new ArrayList())); + + dataSourceRT = mockConfig.get(); + reset(eventManager); + } + + @After + public void clean() { + dataSourceRT.terminate(); + reset(eventManager); + } + + @Test + public void when_invoke_initialize_then_initialized() { + + //when: + dataSourceRT.initialize(); + + //then: + Assert.assertEquals(true, dataSourceRT.isInitialized()); + } + + + @Test + public void when_never_invoke_initialize_then_not_initialized() { + + //then: + Assert.assertEquals(false, dataSourceRT.isInitialized()); + } + + @Test + public void when_invoke_initialize_then_invoke_returnToNormal_times() { + + //when: + dataSourceRT.initialize(); + + //then: + Mockito.verify(eventManager, times(raiseEventTimes)).returnToNormal(any(), anyLong()); + } + + @Test + public void when_invoke_initialize_with_errors_then_invoke_raiseEvent_times() { + + //when: + dataSourceRT.initialize(); + + //then: + Mockito.verify(eventManager, times(returnToNormalTimes)).raiseEvent(any(), anyLong(), anyBoolean(), anyInt(), any(), anyMap()); + } + + public static DataSourceRT createVmStat() { + InputStream inputStreamMock = mock(InputStream.class); + Process processMock = mock(Process.class); + when(processMock.getInputStream()).thenReturn(inputStreamMock); + + java.lang.Runtime runtimeMock = mock(Runtime.class); + try { + when(runtimeMock.exec(anyString())).thenReturn(processMock); + PowerMockito.mockStatic(java.lang.Runtime.class); + when(java.lang.Runtime.getRuntime()).thenReturn(runtimeMock); + + BufferedReader bufferedReader = mock(BufferedReader.class); + when(bufferedReader.readLine()).thenReturn("abc"); + PowerMockito.whenNew(BufferedReader.class).withAnyArguments() + .thenReturn(bufferedReader); + } catch (Exception e) { + throw new RuntimeException(e); + } + return new VMStatDataSourceRT(new VMStatDataSourceVO()); + } +} diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java new file mode 100644 index 0000000000..c8f9356f16 --- /dev/null +++ b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java @@ -0,0 +1,12 @@ +package com.serotonin.mango.rt.dataSource; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + InitializeDataSourceRtTest.class, + InitializeWithErrorsDataSourceRtTest.class +}) +public class InitializeDataSourceRtTestsSuite { +} diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java new file mode 100644 index 0000000000..e6b0307357 --- /dev/null +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -0,0 +1,213 @@ +package com.serotonin.mango.rt.dataSource; + +import br.org.scadabr.rt.dataSource.alpha2.Alpha2DataSource; +import br.org.scadabr.rt.dataSource.asciiSerial.ASCIISerialDataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3IpDataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3SerialDataSource; +import br.org.scadabr.rt.dataSource.drStorageHt5b.DrStorageHt5bDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101EthernetDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101SerialDataSource; +import br.org.scadabr.rt.dataSource.opc.OPCDataSource; +import br.org.scadabr.vo.dataSource.alpha2.Alpha2DataSourceVO; +import br.org.scadabr.vo.dataSource.asciiSerial.ASCIISerialDataSourceVO; +import br.org.scadabr.vo.dataSource.dnp3.Dnp3IpDataSourceVO; +import br.org.scadabr.vo.dataSource.dnp3.Dnp3SerialDataSourceVO; +import br.org.scadabr.vo.dataSource.drStorageHt5b.DrStorageHt5bDataSourceVO; +import br.org.scadabr.vo.dataSource.iec101.IEC101EthernetDataSourceVO; +import br.org.scadabr.vo.dataSource.iec101.IEC101SerialDataSourceVO; +import br.org.scadabr.vo.dataSource.opc.OPCDataSourceVO; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoEventDataSource; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoPollingDataSource; +import cc.radiuino.scadabr.vo.datasource.radiuino.RadiuinoDataSourceVO; +import com.serotonin.mango.Common; +import com.serotonin.mango.rt.EventManager; +import com.serotonin.mango.rt.dataSource.bacnet.BACnetIPDataSourceRT; +import com.serotonin.mango.rt.dataSource.ebro.EBI25DataSourceRT; +import com.serotonin.mango.rt.dataSource.galil.GalilDataSourceRT; +import com.serotonin.mango.rt.dataSource.http.HttpReceiverDataSourceRT; +import com.serotonin.mango.rt.dataSource.modbus.ModbusDataSource; +import com.serotonin.mango.rt.dataSource.modbus.ModbusIpDataSource; +import com.serotonin.mango.rt.dataSource.modbus.ModbusSerialDataSource; +import com.serotonin.mango.rt.dataSource.nmea.NmeaDataSourceRT; +import com.serotonin.mango.rt.dataSource.onewire.OneWireDataSourceRT; +import com.serotonin.mango.rt.dataSource.pachube.PachubeDataSourceRT; +import com.serotonin.mango.rt.dataSource.persistent.PersistentDataSourceRT; +import com.serotonin.mango.rt.dataSource.snmp.SnmpDataSourceRT; +import com.serotonin.mango.rt.dataSource.sql.SqlDataSourceRT; +import com.serotonin.mango.rt.dataSource.viconics.ViconicsDataSourceRT; +import com.serotonin.mango.rt.dataSource.vmstat.VMStatDataSourceRT; +import com.serotonin.mango.vo.dataSource.bacnet.BACnetIPDataSourceVO; +import com.serotonin.mango.vo.dataSource.ebro.EBI25DataSourceVO; +import com.serotonin.mango.vo.dataSource.galil.GalilDataSourceVO; +import com.serotonin.mango.vo.dataSource.http.HttpReceiverDataSourceVO; +import com.serotonin.mango.vo.dataSource.modbus.ModbusIpDataSourceVO; +import com.serotonin.mango.vo.dataSource.modbus.ModbusSerialDataSourceVO; +import com.serotonin.mango.vo.dataSource.nmea.NmeaDataSourceVO; +import com.serotonin.mango.vo.dataSource.onewire.OneWireDataSourceVO; +import com.serotonin.mango.vo.dataSource.pachube.PachubeDataSourceVO; +import com.serotonin.mango.vo.dataSource.persistent.PersistentDataSourceVO; +import com.serotonin.mango.vo.dataSource.snmp.SnmpDataSourceVO; +import com.serotonin.mango.vo.dataSource.sql.SqlDataSourceVO; +import com.serotonin.mango.vo.dataSource.viconics.ViconicsDataSourceVO; +import com.serotonin.mango.vo.dataSource.vmstat.VMStatDataSourceVO; +import com.serotonin.mango.web.ContextWrapper; +import org.apache.derby.iapi.services.i18n.MessageService; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.scada_lts.ds.messaging.MessagingDataSourceRT; +import org.scada_lts.ds.messaging.protocol.amqp.AmqpDataSourceVO; +import org.scada_lts.ds.messaging.protocol.mqtt.MqttDataSourceVO; +import org.scada_lts.ds.messaging.service.MessagingService; +import org.scada_lts.ds.messaging.service.MessagingServiceFactory; + +import java.util.function.Supplier; + +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.modbusMock; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.wrap; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(Parameterized.class) +@PrepareForTest({Common.class}) +@PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", + "javax.activation.*", "javax.management.*"}) +public class InitializeWithErrorsDataSourceRtTest { + + @Parameterized.Parameters(name = "{index}: data source: {1}") + public static Object[][] data() { + PersistentDataSourceVO persistentDataSourceVO = new PersistentDataSourceVO(); + persistentDataSourceVO.setPort(-1); + + ModbusIpDataSourceVO modbusIpDataSourceVO = new ModbusIpDataSourceVO(); + modbusIpDataSourceVO.setTransportType(ModbusIpDataSourceVO.TransportType.TCP_KEEP_ALIVE); + + BACnetIPDataSourceVO baCnetIPDataSourceVO = new BACnetIPDataSourceVO(); + baCnetIPDataSourceVO.setPort(47808); + + AmqpDataSourceVO amqpDataSourceVO = new AmqpDataSourceVO(); + MqttDataSourceVO mqttDataSourceVO = new MqttDataSourceVO(); + mqttDataSourceVO.setServerHost("localhost"); + mqttDataSourceVO.setServerPortNumber(1234); + + MessagingService messageServiceMock = mock(MessagingService.class); + doAnswer(a -> { + throw new RuntimeException(); + }).when(messageServiceMock).open(); + + return new Object[][] { + + {wrap(() -> new ASCIISerialDataSource(new ASCIISerialDataSourceVO<>())), ASCIISerialDataSource.class.getSimpleName()}, + {wrap(() -> new Alpha2DataSource(new Alpha2DataSourceVO<>())), Alpha2DataSource.class.getSimpleName()}, + {wrap(() -> new BACnetIPDataSourceRT(baCnetIPDataSourceVO)), BACnetIPDataSourceRT.class.getSimpleName()}, + {wrap(() -> new Dnp3IpDataSource(new Dnp3IpDataSourceVO())), Dnp3IpDataSource.class.getSimpleName()}, + {wrap(() -> new Dnp3SerialDataSource(new Dnp3SerialDataSourceVO())), Dnp3SerialDataSource.class.getSimpleName()}, + {wrap(() -> new DrStorageHt5bDataSource(new DrStorageHt5bDataSourceVO<>())), DrStorageHt5bDataSource.class.getSimpleName()}, + {wrap(() -> new EBI25DataSourceRT(new EBI25DataSourceVO())), EBI25DataSourceRT.class.getSimpleName()}, + {wrap(() -> new NmeaDataSourceRT(new NmeaDataSourceVO())), NmeaDataSourceRT.class.getSimpleName()}, + {wrap(() -> new RadiuinoEventDataSource(new RadiuinoDataSourceVO<>())), RadiuinoEventDataSource.class.getSimpleName()}, + {wrap(() -> new RadiuinoPollingDataSource(new RadiuinoDataSourceVO<>())), RadiuinoPollingDataSource.class.getSimpleName()}, + {wrap(() -> new VMStatDataSourceRT(new VMStatDataSourceVO())), VMStatDataSourceRT.class.getSimpleName()}, + {wrap(() -> new ViconicsDataSourceRT(new ViconicsDataSourceVO())), ViconicsDataSourceRT.class.getSimpleName()}, + {wrap(() -> new GalilDataSourceRT(new GalilDataSourceVO())), GalilDataSourceRT.class.getSimpleName()}, + {wrap(() -> new IEC101EthernetDataSource(new IEC101EthernetDataSourceVO())), IEC101EthernetDataSource.class.getSimpleName()}, + {wrap(() -> new IEC101SerialDataSource(new IEC101SerialDataSourceVO())), IEC101SerialDataSource.class.getSimpleName()}, + {wrap(() -> new MessagingDataSourceRT(amqpDataSourceVO, MessagingServiceFactory.newService(amqpDataSourceVO))), AmqpDataSourceVO.class.getSimpleName()}, + {wrap(() -> new MessagingDataSourceRT(mqttDataSourceVO, messageServiceMock)), MqttDataSourceVO.class.getSimpleName()}, + + {wrap(() -> new ModbusSerialDataSource(new ModbusSerialDataSourceVO())), ModbusSerialDataSource.class.getSimpleName()}, + {wrap(() -> new ModbusIpDataSource(modbusIpDataSourceVO)), ModbusIpDataSource.class.getSimpleName()}, + {wrap(() -> new OPCDataSource(new OPCDataSourceVO<>())), OPCDataSource.class.getSimpleName()}, + {wrap(() -> new OneWireDataSourceRT(new OneWireDataSourceVO())), OneWireDataSourceRT.class.getSimpleName()}, + {wrap(() -> new SqlDataSourceRT(new SqlDataSourceVO())), SqlDataSourceRT.class.getSimpleName()}, + {wrap(() -> new HttpReceiverDataSourceRT(new HttpReceiverDataSourceVO())), HttpReceiverDataSourceRT.class.getSimpleName()}, + {wrap(() -> new PachubeDataSourceRT(new PachubeDataSourceVO())), PachubeDataSourceRT.class.getSimpleName()}, + {wrap(() -> new SnmpDataSourceRT(new SnmpDataSourceVO())), SnmpDataSourceRT.class.getSimpleName()}, + {wrap(() -> new PersistentDataSourceRT(persistentDataSourceVO)), PersistentDataSourceRT.class.getSimpleName()}, + + }; + } + + private DataSourceRT dataSourceRT; + private final Supplier createDataSource; + + public InitializeWithErrorsDataSourceRtTest(Supplier createDataSource, String name) { + this.createDataSource = createDataSource; + } + + private EventManager eventManager; + + @Before + public void config() { + + eventManager = PowerMockito.mock(EventManager.class); + + ContextWrapper contextWrapper = PowerMockito.mock(ContextWrapper.class); + PowerMockito.when(contextWrapper.getEventManager()).thenReturn(eventManager); + + Common.ctx = contextWrapper; + + this.dataSourceRT = this.createDataSource.get(); + + if(dataSourceRT instanceof BACnetIPDataSourceRT) { + DataSourceRT dataSourceRT1 = this.createDataSource.get(); + dataSourceRT1.initialize(); + } + + reset(eventManager); + } + + @After + public void clean() { + dataSourceRT.terminate(); + } + + @Test + public void when_invoke_initialize_with_errors_then_not_initialized() { + + //when: + dataSourceRT.initialize(); + + //then: + Assert.assertEquals(false, dataSourceRT.isInitialized()); + } + + @Test + public void when_never_invoke_initialize_then_not_initialized() { + + //then: + Assert.assertEquals(false, dataSourceRT.isInitialized()); + } + + @Test + public void when_invoke_initialize_with_errors_then_one_raiseEvent() { + + //when: + dataSourceRT.initialize(); + + //then: + Mockito.verify(eventManager, times(1)).raiseEvent(any(), anyLong(), anyBoolean(), anyInt(), any(), anyMap()); + } + + @Test + public void when_invoke_initialize_with_errors_then_never_returnToNormal() { + + //when: + dataSourceRT.initialize(); + + //then: + Mockito.verify(eventManager, never()).returnToNormal(any(), anyLong()); + } + +} diff --git a/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java b/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java new file mode 100644 index 0000000000..227b38bb04 --- /dev/null +++ b/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java @@ -0,0 +1,443 @@ +package com.serotonin.mango.util; + +import br.org.scadabr.RealOPCMaster; +import br.org.scadabr.rt.dataSource.alpha2.Alpha2DataSource; +import br.org.scadabr.rt.dataSource.asciiSerial.ASCIISerialDataSource; +import br.org.scadabr.rt.dataSource.dnp3.DNP3Master; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3DataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3IpDataSource; +import br.org.scadabr.rt.dataSource.dnp3.Dnp3SerialDataSource; +import br.org.scadabr.rt.dataSource.drStorageHt5b.DrStorageHt5bDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101DataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101EthernetDataSource; +import br.org.scadabr.rt.dataSource.iec101.IEC101Master; +import br.org.scadabr.rt.dataSource.iec101.IEC101SerialDataSource; +import br.org.scadabr.rt.dataSource.opc.OPCDataSource; +import br.org.scadabr.vo.dataSource.alpha2.Alpha2DataSourceVO; +import br.org.scadabr.vo.dataSource.asciiSerial.ASCIISerialDataSourceVO; +import br.org.scadabr.vo.dataSource.dnp3.Dnp3IpDataSourceVO; +import br.org.scadabr.vo.dataSource.dnp3.Dnp3SerialDataSourceVO; +import br.org.scadabr.vo.dataSource.drStorageHt5b.DrStorageHt5bDataSourceVO; +import br.org.scadabr.vo.dataSource.iec101.IEC101EthernetDataSourceVO; +import br.org.scadabr.vo.dataSource.iec101.IEC101SerialDataSourceVO; +import br.org.scadabr.vo.dataSource.opc.OPCDataSourceVO; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoEventDataSource; +import cc.radiuino.scadabr.rt.datasource.radiuino.RadiuinoPollingDataSource; +import cc.radiuino.scadabr.vo.datasource.radiuino.RadiuinoDataSourceVO; +import com.i2msolucoes.alpha24j.layer.user.Alpha2Master; +import com.serotonin.bacnet4j.LocalDevice; +import com.serotonin.bacnet4j.event.DeviceEventHandler; +import com.serotonin.mango.Common; +import com.serotonin.mango.rt.dataImage.DataPointRT; +import com.serotonin.mango.rt.dataSource.DataSourceRT; +import com.serotonin.mango.rt.dataSource.bacnet.BACnetIPDataSourceRT; +import com.serotonin.mango.rt.dataSource.ebro.EBI25Constants; +import com.serotonin.mango.rt.dataSource.ebro.EBI25DataSourceRT; +import com.serotonin.mango.rt.dataSource.galil.GalilDataSourceRT; +import com.serotonin.mango.rt.dataSource.modbus.ModbusDataSource; +import com.serotonin.mango.rt.dataSource.modbus.ModbusIpDataSource; +import com.serotonin.mango.rt.dataSource.modbus.ModbusSerialDataSource; +import com.serotonin.mango.rt.dataSource.nmea.NmeaDataSourceRT; +import com.serotonin.mango.rt.dataSource.nmea.NmeaReceiver; +import com.serotonin.mango.rt.dataSource.onewire.Network; +import com.serotonin.mango.rt.dataSource.onewire.OneWireDataSourceRT; +import com.serotonin.mango.rt.dataSource.pachube.PachubeDataSourceRT; +import com.serotonin.mango.rt.dataSource.snmp.SnmpDataSourceRT; +import com.serotonin.mango.rt.dataSource.sql.SqlDataSourceRT; +import com.serotonin.mango.rt.dataSource.viconics.ViconicsDataSourceRT; +import com.serotonin.mango.util.timeout.TimeoutTask; +import com.serotonin.mango.vo.dataSource.bacnet.BACnetIPDataSourceVO; +import com.serotonin.mango.vo.dataSource.ebro.EBI25DataSourceVO; +import com.serotonin.mango.vo.dataSource.galil.GalilDataSourceVO; +import com.serotonin.mango.vo.dataSource.modbus.ModbusIpDataSourceVO; +import com.serotonin.mango.vo.dataSource.modbus.ModbusSerialDataSourceVO; +import com.serotonin.mango.vo.dataSource.nmea.NmeaDataSourceVO; +import com.serotonin.mango.vo.dataSource.onewire.OneWireDataSourceVO; +import com.serotonin.mango.vo.dataSource.pachube.PachubeDataSourceVO; +import com.serotonin.mango.vo.dataSource.snmp.SnmpDataSourceVO; +import com.serotonin.mango.vo.dataSource.sql.SqlDataSourceVO; +import com.serotonin.mango.vo.dataSource.viconics.ViconicsDataSourceVO; +import com.serotonin.modbus4j.ModbusMaster; +import com.serotonin.modbus4j.exception.ModbusInitException; +import com.serotonin.modbus4j.ip.tcp.TcpMaster; +import com.serotonin.modbus4j.serial.ascii.AsciiMaster; +import com.serotonin.modbus4j.serial.rtu.RtuMaster; +import com.serotonin.viconics.ViconicsNetwork; +import gnu.io.SerialPort; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.params.HttpClientParams; +import org.scada_lts.ds.messaging.MessagingDataSourceRT; +import org.scada_lts.ds.messaging.protocol.amqp.AmqpDataSourceVO; +import org.scada_lts.ds.messaging.protocol.mqtt.MqttDataSourceVO; +import org.scada_lts.ds.messaging.service.MessagingService; +import org.scada_lts.ds.messaging.service.MessagingServiceFactory; +import org.snmp4j.mp.SnmpConstants; +import org.springframework.jdbc.core.JdbcOperations; + +import javax.naming.NamingException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.util.List; +import java.util.function.Supplier; + +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoints; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.setUnreliableDataPoints; +import static org.mockito.ArgumentMatchers.*; +import static org.powermock.api.mockito.PowerMockito.*; +import static org.powermock.api.mockito.PowerMockito.whenNew; + +public final class InitializeDataSourceRtMockUtils { + + private InitializeDataSourceRtMockUtils() {} + + public static SqlDataSourceRT createSql() { + SqlDataSourceRT dataSource = new SqlDataSourceRT(new SqlDataSourceVO()); + sqlMock(dataSource); + return dataSource; + } + + public static OneWireDataSourceRT createOneWire() { + OneWireDataSourceRT dataSource = new OneWireDataSourceRT(new OneWireDataSourceVO()); + oneWireMock(dataSource); + return dataSource; + } + + public static OPCDataSource createOpc() { + OPCDataSource dataSource = new OPCDataSource(new OPCDataSourceVO<>()); + opcMock(dataSource); + return dataSource; + } + + public static ModbusDataSource createModbusIpDataSource() { + ModbusDataSource dataSource = new ModbusIpDataSource(new ModbusIpDataSourceVO()); + modbusMock(dataSource); + return dataSource; + } + + public static ModbusDataSource createModbusSerialDataSource() { + ModbusDataSource dataSource = new ModbusSerialDataSource(new ModbusSerialDataSourceVO()); + modbusMock(dataSource); + return dataSource; + } + + public static IEC101DataSource createIec101Ethernet() { + IEC101DataSource dataSource = new IEC101EthernetDataSource(new IEC101EthernetDataSourceVO()); + iec101Mock(dataSource); + return dataSource; + } + + public static IEC101DataSource createIec101Serial() { + IEC101DataSource dataSource = new IEC101SerialDataSource(new IEC101SerialDataSourceVO()); + iec101Mock(dataSource); + return dataSource; + } + + public static ViconicsDataSourceRT createViconics() { + ViconicsDataSourceRT dataSource = new ViconicsDataSourceRT(new ViconicsDataSourceVO()); + viconicsMock(dataSource); + return dataSource; + } + + public static NmeaDataSourceRT createNmea() { + NmeaDataSourceRT dataSource = new NmeaDataSourceRT(new NmeaDataSourceVO()); + nmeaMock(dataSource); + return dataSource; + } + + public static EBI25DataSourceRT createEbi25() { + EBI25DataSourceRT dataSource = new EBI25DataSourceRT(new EBI25DataSourceVO()); + ebi25Mock(dataSource); + return dataSource; + } + + public static Alpha2DataSource createAlpha2() { + Alpha2DataSource dataSource = new Alpha2DataSource(new Alpha2DataSourceVO<>()); + alpha2Mock(dataSource); + return dataSource; + } + + public static Dnp3DataSource createDnp3Ip() { + Dnp3DataSource dataSource = new Dnp3IpDataSource(new Dnp3IpDataSourceVO()); + dnp3Mock(dataSource); + return dataSource; + } + + public static Dnp3DataSource createDnp3Serial() { + Dnp3DataSource dataSource = new Dnp3SerialDataSource(new Dnp3SerialDataSourceVO()); + dnp3Mock(dataSource); + return dataSource; + } + + public static BACnetIPDataSourceRT createBacNet() { + BACnetIPDataSourceRT dataSource = new BACnetIPDataSourceRT(new BACnetIPDataSourceVO()); + bacNetMock(dataSource); + return dataSource; + } + + public static PachubeDataSourceRT createPachube() { + PachubeDataSourceRT dataSource = new PachubeDataSourceRT(new PachubeDataSourceVO()); + pachubeMock(dataSource); + return dataSource; + } + + public static ASCIISerialDataSource createAsciiSerial() { + ASCIISerialDataSource dataSource = new ASCIISerialDataSource(new ASCIISerialDataSourceVO<>()); + asciiSerialMock(dataSource); + return dataSource; + } + + public static RadiuinoEventDataSource createRadiuino() { + RadiuinoEventDataSource dataSource = new RadiuinoEventDataSource(new RadiuinoDataSourceVO<>()); + radiuinoMock(dataSource); + return dataSource; + } + + public static RadiuinoPollingDataSource createRadiuinoPolling() { + RadiuinoPollingDataSource dataSource = new RadiuinoPollingDataSource(new RadiuinoDataSourceVO<>()); + radiuinoPollingMock(dataSource); + return dataSource; + } + + public static DrStorageHt5bDataSource createDrStorageMock() { + DrStorageHt5bDataSource dataSource = new DrStorageHt5bDataSource(new DrStorageHt5bDataSourceVO<>()); + drStorageMock(dataSource); + return dataSource; + } + + public static MessagingDataSourceRT createAmqp() { + AmqpDataSourceVO amqpDataSourceVO = new AmqpDataSourceVO(); + MessagingService messagingService = mock(MessagingService.class); + return new MessagingDataSourceRT(amqpDataSourceVO, messagingService); + } + + public static MessagingDataSourceRT createMqtt() { + MqttDataSourceVO mqttDataSourceVO = new MqttDataSourceVO(); + MessagingService messagingService = MessagingServiceFactory.newService(mqttDataSourceVO); + return new MessagingDataSourceRT(mqttDataSourceVO, messagingService); + } + + public static SnmpDataSourceRT createSnmp() { + SnmpDataSourceVO snmpDataSourceVO = new SnmpDataSourceVO(); + snmpDataSourceVO.setSnmpVersion(SnmpConstants.version1); + snmpDataSourceVO.setCommunity("comm"); + SnmpDataSourceRT dataSource = new SnmpDataSourceRT(snmpDataSourceVO); + return dataSource; + } + + public static GalilDataSourceRT createGalil() { + GalilDataSourceVO galilDataSourceVO = new GalilDataSourceVO(); + galilDataSourceVO.setHost("localhost"); + galilDataSourceVO.setTimeout(1); + galilDataSourceVO.setPort(1111); + GalilDataSourceRT dataSource = new GalilDataSourceRT(galilDataSourceVO); + galilMock(dataSource); + return dataSource; + } + + public static Supplier wrap(Supplier function) { + return function; + } + + public static void reset(List list1, List list2, List list3) { + resetUnreliableDataPoints(list1); + resetUnreliableDataPoints(list2); + resetUnreliableDataPoints(list3); + } + + public static void set(List list1, List list2, List list3) { + setUnreliableDataPoints(list1); + setUnreliableDataPoints(list2); + setUnreliableDataPoints(list3); + } + + private static void sqlMock(SqlDataSourceRT dataSource) { + mockStatic(SqlDataSourceUtils.class); + JdbcOperations jdbcOperations = mock(JdbcOperations.class); + when(jdbcOperations.queryForObject(anyString(), eq(int.class))).thenReturn(1); + try { + when(SqlDataSourceUtils.createJdbcOperations(any())) + .thenReturn(jdbcOperations); + } catch (NamingException e) { + throw new RuntimeException(e); + } + } + + private static void oneWireMock(OneWireDataSourceRT dataSource) { + Network networkMock = mock(Network.class); + try { + whenNew(Network.class).withAnyArguments() + .thenReturn(networkMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void opcMock(OPCDataSource dataSource) { + RealOPCMaster realOPCMasterMock = mock(RealOPCMaster.class); + try { + whenNew(RealOPCMaster.class).withAnyArguments() + .thenReturn(realOPCMasterMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static void modbusMock(ModbusDataSource dataSource) { + AsciiMaster asciiMasterMock = mock(AsciiMaster.class); + TcpMaster tcpMasterMock = mock(TcpMaster.class); + RtuMaster rtuMasterMock = mock(RtuMaster.class); + try { + whenNew(AsciiMaster.class).withAnyArguments() + .thenReturn(asciiMasterMock); + whenNew(TcpMaster.class).withAnyArguments() + .thenReturn(tcpMasterMock); + whenNew(RtuMaster.class).withAnyArguments() + .thenReturn(rtuMasterMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void iec101Mock(IEC101DataSource dataSource) { + IEC101Master iec101MasterMock = mock(IEC101Master.class); + try { + whenNew(IEC101Master.class).withAnyArguments() + .thenReturn(iec101MasterMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void galilMock(GalilDataSourceRT dataSource) { + InputStream inputStreamMock = mock(InputStream.class); + OutputStream outputStreamMock = mock(OutputStream.class); + + Socket socketMock = mock(Socket.class); + + try { + doAnswer(a -> { + return null; + }).when(socketMock).connect(any()); + + when(socketMock.getInputStream()).thenReturn(inputStreamMock); + when(socketMock.getOutputStream()).thenReturn(outputStreamMock); + + whenNew(Socket.class).withAnyArguments() + .thenReturn(socketMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void viconicsMock(ViconicsDataSourceRT dataSource) { + ViconicsNetwork viconicsNetworkMock = mock(ViconicsNetwork.class); + try { + whenNew(ViconicsNetwork.class).withAnyArguments() + .thenReturn(viconicsNetworkMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void nmeaMock(NmeaDataSourceRT dataSource) { + NmeaReceiver nmeaReceiverMock = mock(NmeaReceiver.class); + TimeoutTask timeoutTaskMock = mock(TimeoutTask.class); + try { + whenNew(NmeaReceiver.class).withAnyArguments() + .thenReturn(nmeaReceiverMock); + whenNew(TimeoutTask.class).withAnyArguments() + .thenReturn(timeoutTaskMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void ebi25Mock(EBI25DataSourceRT dataSource) { + ModbusMaster modbusMasterMock = mock(ModbusMaster.class); + mockStatic(EBI25Constants.class); + try { + when(EBI25Constants.initModbusMaster(anyString(), anyInt(), anyBoolean(), anyInt(), anyInt(), any())) + .thenReturn(modbusMasterMock); + } catch (ModbusInitException e) { + throw new RuntimeException(e); + } + } + + private static void alpha2Mock(Alpha2DataSource dataSource) { + Alpha2Master alpha2MasterMock = mock(Alpha2Master.class); + try { + doAnswer(invocation -> { + return null; + }).when(alpha2MasterMock).init(); + whenNew(Alpha2Master.class) + .withAnyArguments() + .thenReturn(alpha2MasterMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void dnp3Mock(Dnp3DataSource dataSource) { + DNP3Master dnp3MasterMock = mock(DNP3Master.class); + try { + whenNew(DNP3Master.class) + .withAnyArguments() + .thenReturn(dnp3MasterMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void bacNetMock(BACnetIPDataSourceRT dataSource) { + LocalDevice localDeviceMock = mock(LocalDevice.class); + + DeviceEventHandler deviceEventHandlerMock = mock(DeviceEventHandler.class); + when(localDeviceMock.getEventHandler()).thenReturn(deviceEventHandlerMock); + when(localDeviceMock.isInitialized()).thenReturn(true); + + try { + whenNew(LocalDevice.class) + .withAnyArguments() + .thenReturn(localDeviceMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static void pachubeMock(PachubeDataSourceRT dataSource) { + HttpClient httpClient = mock(HttpClient.class); + when(httpClient.getParams()).thenReturn(new HttpClientParams()); + mockStatic(Common.class); + when(Common.getHttpClient(anyInt())).thenReturn(httpClient); + } + + private static void asciiSerialMock(ASCIISerialDataSource dataSource) { + SerialPort serialPortMock = mock(SerialPort.class); + dataSource.setsPort(serialPortMock); + } + + private static void radiuinoMock(RadiuinoEventDataSource dataSource) { + SerialPort serialPortMock = mock(SerialPort.class); + dataSource.setsPort(serialPortMock); + } + + private static void radiuinoPollingMock(RadiuinoPollingDataSource dataSource) { + SerialPort serialPortMock = mock(SerialPort.class); + dataSource.setsPort(serialPortMock); + } + + private static void drStorageMock(DrStorageHt5bDataSource dataSource) { + SerialPort serialPortMock = mock(SerialPort.class); + dataSource.setsPort(serialPortMock); + InputStream inputStreamMock = mock(InputStream.class); + try { + when(inputStreamMock.available()).thenReturn(1); + } catch (IOException e) { + throw new RuntimeException(e); + } + dataSource.setInSerialStream(inputStreamMock); + dataSource.setsPort(serialPortMock); + } +} diff --git a/webapp-resources/log4j2.xml b/webapp-resources/log4j2.xml index 60a337baf5..9e003e9c99 100644 --- a/webapp-resources/log4j2.xml +++ b/webapp-resources/log4j2.xml @@ -34,8 +34,8 @@ ERROR ERROR ERROR - WARN - WARN + ERROR + ERROR ERROR From b8aaf1c4bbce9afebe71acfff28aafeaeb0a4a5e Mon Sep 17 00:00:00 2001 From: Kamil Date: Tue, 27 Feb 2024 08:48:12 +0100 Subject: [PATCH 16/63] #2755 Signaling the data source that has a problem: - corrected test: InitializeWithErrorsDataSourceRtTest; - change type catch from IOException to Throwable; --- .../dataSource/vmstat/VMStatDataSourceRT.java | 2 +- .../InitializeWithErrorsDataSourceRtTest.java | 20 ++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java index bb36105dde..9ff2fc32c1 100644 --- a/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/vmstat/VMStatDataSourceRT.java @@ -139,7 +139,7 @@ else if ("st".equals(headerParts[i])) returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } - catch (IOException e) { + catch (Throwable e) { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage( "event.initializationError", e.getMessage())); return; diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java index e6b0307357..b1ae87e2f4 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -25,7 +25,6 @@ import com.serotonin.mango.rt.dataSource.ebro.EBI25DataSourceRT; import com.serotonin.mango.rt.dataSource.galil.GalilDataSourceRT; import com.serotonin.mango.rt.dataSource.http.HttpReceiverDataSourceRT; -import com.serotonin.mango.rt.dataSource.modbus.ModbusDataSource; import com.serotonin.mango.rt.dataSource.modbus.ModbusIpDataSource; import com.serotonin.mango.rt.dataSource.modbus.ModbusSerialDataSource; import com.serotonin.mango.rt.dataSource.nmea.NmeaDataSourceRT; @@ -51,7 +50,6 @@ import com.serotonin.mango.vo.dataSource.viconics.ViconicsDataSourceVO; import com.serotonin.mango.vo.dataSource.vmstat.VMStatDataSourceVO; import com.serotonin.mango.web.ContextWrapper; -import org.apache.derby.iapi.services.i18n.MessageService; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -65,14 +63,15 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunnerDelegate; import org.scada_lts.ds.messaging.MessagingDataSourceRT; +import org.scada_lts.ds.messaging.exception.MessagingServiceException; import org.scada_lts.ds.messaging.protocol.amqp.AmqpDataSourceVO; import org.scada_lts.ds.messaging.protocol.mqtt.MqttDataSourceVO; import org.scada_lts.ds.messaging.service.MessagingService; import org.scada_lts.ds.messaging.service.MessagingServiceFactory; +import java.io.IOException; import java.util.function.Supplier; -import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.modbusMock; import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.wrap; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -103,7 +102,7 @@ public static Object[][] data() { MessagingService messageServiceMock = mock(MessagingService.class); doAnswer(a -> { - throw new RuntimeException(); + throw new MessagingServiceException(); }).when(messageServiceMock).open(); return new Object[][] { @@ -166,6 +165,18 @@ public void config() { } reset(eventManager); + + java.lang.Runtime runtimeMock = mock(Runtime.class); + try { + doAnswer(a -> { + throw new IOException(); + }).when(runtimeMock).exec(anyString()); + PowerMockito.mockStatic(java.lang.Runtime.class); + when(java.lang.Runtime.getRuntime()).thenReturn(runtimeMock); + + } catch (Exception e) { + throw new RuntimeException(e); + } } @After @@ -209,5 +220,4 @@ public void when_invoke_initialize_with_errors_then_never_returnToNormal() { //then: Mockito.verify(eventManager, never()).returnToNormal(any(), anyLong()); } - } From 1be40ff591c5e04a3703ae5d9e987e75a49ac6c3 Mon Sep 17 00:00:00 2001 From: Kamil Date: Tue, 27 Feb 2024 08:59:28 +0100 Subject: [PATCH 17/63] #2755 Signaling the data source that has a problem: - corrected test: InitializeWithErrorsDataSourceRtTest for VMStatDataSourceRT - update PrepareForTest annotation, if dataSourceRT instanceof VMStatDataSourceRT, for MessagingDataSourceRT with MQTT throw MessagingServiceException after invoke MessageService.open; --- .../InitializeWithErrorsDataSourceRtTest.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java index b1ae87e2f4..cb8759df50 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -79,7 +79,7 @@ @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(Parameterized.class) -@PrepareForTest({Common.class}) +@PrepareForTest({Common.class, Runtime.class, VMStatDataSourceRT.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class InitializeWithErrorsDataSourceRtTest { @@ -102,7 +102,7 @@ public static Object[][] data() { MessagingService messageServiceMock = mock(MessagingService.class); doAnswer(a -> { - throw new MessagingServiceException(); + throw new MessagingServiceException("From test"); }).when(messageServiceMock).open(); return new Object[][] { @@ -166,16 +166,18 @@ public void config() { reset(eventManager); - java.lang.Runtime runtimeMock = mock(Runtime.class); - try { - doAnswer(a -> { - throw new IOException(); - }).when(runtimeMock).exec(anyString()); - PowerMockito.mockStatic(java.lang.Runtime.class); - when(java.lang.Runtime.getRuntime()).thenReturn(runtimeMock); - - } catch (Exception e) { - throw new RuntimeException(e); + if(dataSourceRT instanceof VMStatDataSourceRT) { + java.lang.Runtime runtimeMock = mock(Runtime.class); + try { + doAnswer(a -> { + throw new IOException("From test"); + }).when(runtimeMock).exec(anyString()); + PowerMockito.mockStatic(java.lang.Runtime.class); + when(java.lang.Runtime.getRuntime()).thenReturn(runtimeMock); + + } catch (Exception e) { + throw new RuntimeException(e); + } } } From 03eaa319f0d31b79e2addaa6a4b9ae98024ba688 Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 28 Feb 2024 07:19:36 +0100 Subject: [PATCH 18/63] #2755 Signaling the data source that has a problem: - fixed generate many events by ModbusDataSource; - corrected test InitializeDataSourceRtTest; - refactor InitializeDataSourceRtMockUtils; --- .../dataSource/galil/GalilDataSourceRT.java | 2 + .../dataSource/modbus/ModbusDataSource.java | 9 +- .../dataSource/modbus/ModbusDataSourceVO.java | 4 + .../DataPointUnreliableUtilsTest.java | 92 ++++++------------- .../InitializeDataSourceRtTest.java | 90 +++++++++--------- .../InitializeWithErrorsDataSourceRtTest.java | 56 +++++------ .../util/InitializeDataSourceRtMockUtils.java | 74 +++++++++++---- 7 files changed, 164 insertions(+), 163 deletions(-) diff --git a/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java index 2a0c7bd624..62d30be4a8 100644 --- a/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/galil/GalilDataSourceRT.java @@ -109,6 +109,7 @@ synchronized protected void doPoll(long time) { // Raise an event. raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.pollingError", messageException.getMessage())); + return; } else // Deactivate any existing event. @@ -117,6 +118,7 @@ synchronized protected void doPoll(long time) { if (pointError != null) { // Raise an event. raiseEvent(POINT_READ_EXCEPTION_EVENT, time, true, pointError); + return; } else // Deactivate any existing event. diff --git a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java index 720138125b..d603047bb7 100644 --- a/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java +++ b/src/com/serotonin/mango/rt/dataSource/modbus/ModbusDataSource.java @@ -63,6 +63,7 @@ abstract public class ModbusDataSource extends PollingDataSource implements public static final int POINT_WRITE_EXCEPTION_EVENT = 2; public static final int DATA_SOURCE_EXCEPTION_EVENT = 3; public static final int MONITOR_WRITE_EXCEPTION_EVENT = 4; + public static final int INITIALIZATION_EXCEPTION_EVENT = 5; private ModbusMaster modbusMaster; private BatchRead batchRead; @@ -154,9 +155,9 @@ public void removeDataPoint(DataPointRT dataPoint) { protected void doPoll(long time) { try { checkInitialized(modbusMaster, this); - returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); + returnToNormal(INITIALIZATION_EXCEPTION_EVENT, time); } catch (Throwable e) { - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, time, true, + raiseEvent(INITIALIZATION_EXCEPTION_EVENT, time, true, getLocalExceptionMessage(e)); return; } @@ -355,10 +356,10 @@ protected void initialize(ModbusMaster modbusMaster) { modbusMaster.init(); // Deactivate any existing event. - returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, + returnToNormal(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { - raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), + raiseEvent(INITIALIZATION_EXCEPTION_EVENT, System.currentTimeMillis(), true, getLocalExceptionMessage(e)); return; } diff --git a/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java b/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java index ff7e0b4ad5..4acea0b155 100644 --- a/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java +++ b/src/com/serotonin/mango/vo/dataSource/modbus/ModbusDataSourceVO.java @@ -54,6 +54,8 @@ protected void addEventTypes(List ets) { new LocalizableMessage("event.ds.pointWrite"))); ets.add(createEventType(ModbusDataSource.MONITOR_WRITE_EXCEPTION_EVENT, new LocalizableMessage("event.ds.monitorWrite"))); + ets.add(createEventType(ModbusDataSource.INITIALIZATION_EXCEPTION_EVENT, + new LocalizableMessage("event.ds.initialization"))); } private static final ExportCodes EVENT_CODES = new ExportCodes(); @@ -66,6 +68,8 @@ protected void addEventTypes(List ets) { "POINT_WRITE_EXCEPTION"); EVENT_CODES.addElement(ModbusDataSource.MONITOR_WRITE_EXCEPTION_EVENT, "MONITOR_WRITE_EXCEPTION"); + EVENT_CODES.addElement(ModbusDataSource.INITIALIZATION_EXCEPTION_EVENT, + "INITIALIZATION_EXCEPTION"); } @Override diff --git a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java index e1f052c28e..4cdb810e19 100644 --- a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java +++ b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java @@ -9,14 +9,12 @@ import com.serotonin.mango.rt.RuntimeManager; import com.serotonin.mango.rt.dataImage.DataPointRT; import com.serotonin.mango.rt.dataImage.PointValueCache; -import com.serotonin.mango.rt.maint.BackgroundProcessing; import com.serotonin.mango.vo.DataPointVO; import com.serotonin.mango.vo.TimePeriodType; import com.serotonin.mango.vo.dataSource.meta.MetaDataSourceVO; import com.serotonin.mango.vo.dataSource.meta.MetaPointLocatorVO; import com.serotonin.mango.vo.dataSource.virtual.VirtualDataSourceVO; import com.serotonin.mango.vo.dataSource.virtual.VirtualPointLocatorVO; -import com.serotonin.mango.web.ContextWrapper; import com.serotonin.mango.web.dwr.MiscDwr; import com.serotonin.web.content.ContentGenerator; import org.directwebremoting.WebContextFactory; @@ -28,12 +26,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.scada_lts.dao.SystemSettingsDAO; -import org.scada_lts.mango.service.DataPointService; -import org.scada_lts.mango.service.DataSourceService; -import org.scada_lts.mango.service.PointValueService; -import org.scada_lts.mango.service.SystemSettingsService; import org.scada_lts.web.beans.ApplicationBeans; -import org.scada_lts.web.ws.services.DataPointServiceWebSocket; import java.util.ArrayList; import java.util.Arrays; @@ -41,10 +34,10 @@ import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoints; -import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.reset; -import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.set; -import static org.mockito.ArgumentMatchers.anyString; -import static org.powermock.api.mockito.PowerMockito.*; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.resetUnreliable; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.setUnreliable; +import static org.mockito.Mockito.mock; +import static utils.mock.RuntimeMockUtils.runtimeManagerMock; @RunWith(PowerMockRunner.class) @PrepareForTest({WebContextFactory.class, Common.class, MiscDwr.class, SystemSettingsDAO.class, @@ -80,40 +73,7 @@ public class DataPointUnreliableUtilsTest { @Before public void configMock() throws Exception { - DataSourceService dataSourceService = mock(DataSourceService.class); - whenNew(DataSourceService.class).withNoArguments().thenReturn(dataSourceService); - - DataPointService dataPointService = mock(DataPointService.class); - whenNew(DataPointService.class).withNoArguments().thenReturn(dataPointService); - - SystemSettingsService systemSettingsService = mock(SystemSettingsService.class); - whenNew(SystemSettingsService.class).withNoArguments().thenReturn(systemSettingsService); - - SystemSettingsDAO systemSettingsDAO = mock(SystemSettingsDAO.class); - whenNew(SystemSettingsDAO.class).withNoArguments().thenReturn(systemSettingsDAO); - - mockStatic(SystemSettingsDAO.class); - when(SystemSettingsDAO.getValue(anyString())).thenReturn(""); - when(SystemSettingsDAO.getFutureDateLimit()).thenReturn(1L); - - PointValueService mangoPointValues = mock(PointValueService.class); - whenNew(PointValueService.class).withNoArguments().thenReturn(mangoPointValues); - - mockStatic(ApplicationBeans.class); - DataPointServiceWebSocket dataPointServiceWebSocket = mock(DataPointServiceWebSocket.class); - when(ApplicationBeans.getDataPointServiceWebSocketBean()).thenReturn(dataPointServiceWebSocket); - - ContextWrapper contextWrapper = mock(ContextWrapper.class); - EventManager eventManager = mock(EventManager.class); - BackgroundProcessing backgroundProcessing = mock(BackgroundProcessing.class); - - runtimeManager = new RuntimeManager(); - when(contextWrapper.getRuntimeManager()).thenReturn(runtimeManager); - when(contextWrapper.getEventManager()).thenReturn(eventManager); - when(contextWrapper.getBackgroundProcessing()).thenReturn(backgroundProcessing); - - Common.ctx = contextWrapper; - Common.timer.init(); + runtimeManagerMock(this.runtimeManager = new RuntimeManager(), mock(EventManager.class)); configData(); } @@ -213,7 +173,7 @@ private void configData() { public void when_setUnreliableDataPoints_with_virtual_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(virtualDataPoints); @@ -228,7 +188,7 @@ public void when_setUnreliableDataPoints_with_virtual_points_then_unreliable_tru public void when_setUnreliableDataPoints_with_meta_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(metaDataPoints); @@ -243,7 +203,7 @@ public void when_setUnreliableDataPoints_with_meta_points_then_unreliable_true() public void when_setUnreliableDataPoints_with_meta_points_with_context_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(metaDataPointsWithContext); @@ -291,7 +251,7 @@ public void when_getRunningDataSource_meta_data_source_with_context_then_initial public void when_setUnreliableDataPoint_with_virtual_point_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); //when: @@ -306,7 +266,7 @@ public void when_setUnreliableDataPoint_with_virtual_point_then_unreliable_true( public void when_setUnreliableDataPoint_with_meta_point_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); //when: @@ -321,7 +281,7 @@ public void when_setUnreliableDataPoint_with_meta_point_then_unreliable_true() { public void when_setUnreliableDataPoint_with_meta_point_with_context_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint6WithVirtualDataPoint1.getId()); //when: @@ -336,7 +296,7 @@ public void when_setUnreliableDataPoint_with_meta_point_with_context_then_unreli public void when_setUnreliableDataPoints_with_virtual_points_then_meta_points_unreliable_false() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(virtualDataPoints); @@ -351,7 +311,7 @@ public void when_setUnreliableDataPoints_with_virtual_points_then_meta_points_un public void when_setUnreliableDataPoints_with_virtual_points_from_meta_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(virtualDataPoints); @@ -366,7 +326,7 @@ public void when_setUnreliableDataPoints_with_virtual_points_from_meta_points_th public void when_setUnreliableDataPoint_with_meta_point_from_context_meta_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); //when: @@ -382,7 +342,7 @@ public void when_setUnreliableDataPoint_with_meta_point_from_context_meta_points public void when_setUnreliableDataPoint_with_meta_point_from_context_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); //when: @@ -398,7 +358,7 @@ public void when_setUnreliableDataPoint_with_meta_point_from_context_then_unreli public void when_setUnreliableDataPoints_with_virtual_points_from_context_meta_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); //when: setUnreliableDataPoints(virtualDataPoints); @@ -413,7 +373,7 @@ public void when_setUnreliableDataPoints_with_virtual_points_from_context_meta_p public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_points_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); //when: @@ -429,7 +389,7 @@ public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_poi public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_point_then_unreliable_true() { //given: - reset(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + resetUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint2.getId()); DataPointRT metaDataPointRT = runtimeManager.getDataPoint(metaDataPoint9WithVirtualDataPoint2.getId()); @@ -445,7 +405,7 @@ public void when_setUnreliableDataPoint_with_virtual_point_from_context_meta_poi public void when_resetUnreliableDataPoint_with_virtual_point_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); //when: @@ -460,7 +420,7 @@ public void when_resetUnreliableDataPoint_with_virtual_point_then_unreliable_fal public void when_resetUnreliableDataPoint_with_meta_point_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); //when: @@ -475,7 +435,7 @@ public void when_resetUnreliableDataPoint_with_meta_point_then_unreliable_false( public void when_resetUnreliableDataPoint_with_meta_point_with_context_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint6WithVirtualDataPoint1.getId()); //when: @@ -490,7 +450,7 @@ public void when_resetUnreliableDataPoint_with_meta_point_with_context_then_unre public void when_resetUnreliableDataPoint_with_meta_point_from_context_meta_point_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint10WithVirtualDataPoint1.getId()); //when: @@ -506,7 +466,7 @@ public void when_resetUnreliableDataPoint_with_meta_point_from_context_meta_poin public void when_resetUnreliableDataPoints_with_meta_point_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); //when: @@ -521,7 +481,7 @@ public void when_resetUnreliableDataPoints_with_meta_point_then_unreliable_false public void when_resetUnreliableDataPoints_with_meta_points_then_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(metaDataPoint1.getId()); //when: @@ -536,7 +496,7 @@ public void when_resetUnreliableDataPoints_with_meta_points_then_unreliable_fals public void when_resetUnreliableDataPoints_with_virtual_point_from_context_meta_point_then_meta_points_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint1.getId()); //when: @@ -552,7 +512,7 @@ public void when_resetUnreliableDataPoints_with_virtual_point_from_context_meta_ public void when_resetUnreliableDataPoints_with_virtual_point_from_context_meta_point_then_meta_point_unreliable_false() { //given: - set(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); + setUnreliable(virtualDataPoints, metaDataPoints, metaDataPointsWithContext); DataPointRT dataPointRT = runtimeManager.getDataPoint(virtualDataPoint2.getId()); DataPointRT metaDataPointRT = runtimeManager.getDataPoint(metaDataPoint9WithVirtualDataPoint2.getId()); diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java index c8cea6f337..2be4d05b89 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java @@ -77,7 +77,7 @@ import java.util.ArrayList; import java.util.function.Supplier; -import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.wrap; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.supplier; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -98,47 +98,47 @@ public static Object[][] data() throws Exception { return new Object[][] { - {ASCIISerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAsciiSerial), 1, 0}, - {Alpha2DataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAlpha2), 1, 0}, - {BACnetIPDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createBacNet), 3, 0}, - {Dnp3IpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDnp3Ip), 1, 0}, - {Dnp3SerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDnp3Serial), 1, 0}, - {DrStorageHt5bDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createDrStorageMock), 1, 0}, - {EBI25DataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createEbi25), 1, 0}, - {NmeaDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createNmea), 1, 0}, - {RadiuinoEventDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createRadiuino), 1, 0}, - {RadiuinoPollingDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createRadiuinoPolling), 1, 0}, - {VMStatDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtTest::createVmStat), 1, 0}, - {ViconicsDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createViconics), 1, 0}, - {GalilDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createGalil), 1, 0}, - {IEC101EthernetDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createIec101Ethernet), 1, 0}, - {IEC101SerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createIec101Serial), 1, 0}, - {AmqpDataSourceVO.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createAmqp), 1, 0}, - {MqttDataSourceVO.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createMqtt), 1, 0}, - {ModbusIpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, - {ModbusSerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, - {OPCDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createOpc), 1, 0}, - {OneWireDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createOneWire), 1, 0}, - {SqlDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSql), 1, 0}, - {HttpReceiverDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSql), 1, 0}, - {PachubeDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createPachube), 1, 0}, - {SnmpDataSourceRT.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createSnmp), 1, 0}, - {PersistentDataSourceRT.class.getSimpleName(), wrap(() -> new PersistentDataSourceRT(new PersistentDataSourceVO())), 1, 0}, - {ModbusIpDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, - {ModbusSerialDataSource.class.getSimpleName(), wrap(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, - - - {VirtualDataSourceRT.class.getSimpleName(), wrap(() -> new VirtualDataSourceRT(new VirtualDataSourceVO())), 0, 0}, - {ASCIIFileDataSource.class.getSimpleName(), wrap(() -> new ASCIIFileDataSource(new ASCIIFileDataSourceVO<>())), 0, 0}, - {HttpImageDataSourceRT.class.getSimpleName(), wrap(() -> new HttpImageDataSourceRT(new HttpImageDataSourceVO())), 0, 0}, - {HttpRetrieverDataSourceRT.class.getSimpleName(), wrap(() -> new HttpRetrieverDataSourceRT(new HttpRetrieverDataSourceVO())), 0, 0}, - {InternalDataSourceRT.class.getSimpleName(), wrap(() -> new InternalDataSourceRT(new InternalDataSourceVO())), 0, 0}, - {JmxDataSourceRT.class.getSimpleName(), wrap(() -> new JmxDataSourceRT(new JmxDataSourceVO())), 0, 0}, - {MBusDataSourceRT.class.getSimpleName(), wrap(() -> new MBusDataSourceRT(new MBusDataSourceVO())), 0, 0}, - {MetaDataSourceRT.class.getSimpleName(), wrap(() -> new MetaDataSourceRT(new MetaDataSourceVO())), 0, 0}, - {NodaveS7DataSource.class.getSimpleName(), wrap(() -> new NodaveS7DataSource(new NodaveS7DataSourceVO<>())), 0, 0}, - {OpenV4JDataSourceRT.class.getSimpleName(), wrap(() -> new OpenV4JDataSourceRT(new OpenV4JDataSourceVO())), 0, 0}, - {Pop3DataSourceRT.class.getSimpleName(), wrap(() -> new Pop3DataSourceRT(new Pop3DataSourceVO())), 0, 0}, + {ASCIISerialDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createAsciiSerial), 1, 0}, + {Alpha2DataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createAlpha2), 1, 0}, + {BACnetIPDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createBacNet), 3, 0}, + {Dnp3IpDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createDnp3Ip), 1, 0}, + {Dnp3SerialDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createDnp3Serial), 1, 0}, + {DrStorageHt5bDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createDrStorageMock), 1, 0}, + {EBI25DataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createEbi25), 1, 0}, + {NmeaDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createNmea), 1, 0}, + {RadiuinoEventDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createRadiuino), 1, 0}, + {RadiuinoPollingDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createRadiuinoPolling), 1, 0}, + {VMStatDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtTest::createVmStat), 1, 0}, + {ViconicsDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createViconics), 1, 0}, + {GalilDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createGalil), 1, 0}, + {IEC101EthernetDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createIec101Ethernet), 1, 0}, + {IEC101SerialDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createIec101Serial), 1, 0}, + {AmqpDataSourceVO.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createAmqp), 1, 0}, + {MqttDataSourceVO.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createMqtt), 1, 0}, + {ModbusIpDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, + {ModbusSerialDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, + {OPCDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createOpc), 1, 0}, + {OneWireDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createOneWire), 1, 0}, + {SqlDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createSql), 1, 0}, + {HttpReceiverDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createSql), 1, 0}, + {PachubeDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createPachube), 1, 0}, + {SnmpDataSourceRT.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createSnmp), 1, 0}, + {PersistentDataSourceRT.class.getSimpleName(), supplier(() -> new PersistentDataSourceRT(new PersistentDataSourceVO())), 1, 0}, + {ModbusIpDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createModbusIpDataSource), 1, 0}, + {ModbusSerialDataSource.class.getSimpleName(), supplier(InitializeDataSourceRtMockUtils::createModbusSerialDataSource), 1, 0}, + + + {VirtualDataSourceRT.class.getSimpleName(), supplier(() -> new VirtualDataSourceRT(new VirtualDataSourceVO())), 0, 0}, + {ASCIIFileDataSource.class.getSimpleName(), supplier(() -> new ASCIIFileDataSource(new ASCIIFileDataSourceVO<>())), 0, 0}, + {HttpImageDataSourceRT.class.getSimpleName(), supplier(() -> new HttpImageDataSourceRT(new HttpImageDataSourceVO())), 0, 0}, + {HttpRetrieverDataSourceRT.class.getSimpleName(), supplier(() -> new HttpRetrieverDataSourceRT(new HttpRetrieverDataSourceVO())), 0, 0}, + {InternalDataSourceRT.class.getSimpleName(), supplier(() -> new InternalDataSourceRT(new InternalDataSourceVO())), 0, 0}, + {JmxDataSourceRT.class.getSimpleName(), supplier(() -> new JmxDataSourceRT(new JmxDataSourceVO())), 0, 0}, + {MBusDataSourceRT.class.getSimpleName(), supplier(() -> new MBusDataSourceRT(new MBusDataSourceVO())), 0, 0}, + {MetaDataSourceRT.class.getSimpleName(), supplier(() -> new MetaDataSourceRT(new MetaDataSourceVO())), 0, 0}, + {NodaveS7DataSource.class.getSimpleName(), supplier(() -> new NodaveS7DataSource(new NodaveS7DataSourceVO<>())), 0, 0}, + {OpenV4JDataSourceRT.class.getSimpleName(), supplier(() -> new OpenV4JDataSourceRT(new OpenV4JDataSourceVO())), 0, 0}, + {Pop3DataSourceRT.class.getSimpleName(), supplier(() -> new Pop3DataSourceRT(new Pop3DataSourceVO())), 0, 0}, }; } @@ -148,7 +148,7 @@ public static Object[][] data() throws Exception { private final int returnToNormalTimes; private final Supplier mockConfig; - public InitializeDataSourceRtTest(String name, Supplier mockConfig, int raiseEventTimes, int returnToNormalTimes) { + public InitializeDataSourceRtTest(String name, Supplier mockConfig, int returnToNormalTimes, int raiseEventTimes) { this.raiseEventTimes = raiseEventTimes; this.returnToNormalTimes = returnToNormalTimes; this.mockConfig = mockConfig; @@ -205,7 +205,7 @@ public void when_invoke_initialize_then_invoke_returnToNormal_times() { dataSourceRT.initialize(); //then: - Mockito.verify(eventManager, times(raiseEventTimes)).returnToNormal(any(), anyLong()); + Mockito.verify(eventManager, times(returnToNormalTimes)).returnToNormal(any(), anyLong()); } @Test @@ -215,7 +215,7 @@ public void when_invoke_initialize_with_errors_then_invoke_raiseEvent_times() { dataSourceRT.initialize(); //then: - Mockito.verify(eventManager, times(returnToNormalTimes)).raiseEvent(any(), anyLong(), anyBoolean(), anyInt(), any(), anyMap()); + Mockito.verify(eventManager, times(raiseEventTimes)).raiseEvent(any(), anyLong(), anyBoolean(), anyInt(), any(), anyMap()); } public static DataSourceRT createVmStat() { diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java index cb8759df50..29bed5ffbc 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -72,7 +72,7 @@ import java.io.IOException; import java.util.function.Supplier; -import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.wrap; +import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.supplier; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -107,33 +107,33 @@ public static Object[][] data() { return new Object[][] { - {wrap(() -> new ASCIISerialDataSource(new ASCIISerialDataSourceVO<>())), ASCIISerialDataSource.class.getSimpleName()}, - {wrap(() -> new Alpha2DataSource(new Alpha2DataSourceVO<>())), Alpha2DataSource.class.getSimpleName()}, - {wrap(() -> new BACnetIPDataSourceRT(baCnetIPDataSourceVO)), BACnetIPDataSourceRT.class.getSimpleName()}, - {wrap(() -> new Dnp3IpDataSource(new Dnp3IpDataSourceVO())), Dnp3IpDataSource.class.getSimpleName()}, - {wrap(() -> new Dnp3SerialDataSource(new Dnp3SerialDataSourceVO())), Dnp3SerialDataSource.class.getSimpleName()}, - {wrap(() -> new DrStorageHt5bDataSource(new DrStorageHt5bDataSourceVO<>())), DrStorageHt5bDataSource.class.getSimpleName()}, - {wrap(() -> new EBI25DataSourceRT(new EBI25DataSourceVO())), EBI25DataSourceRT.class.getSimpleName()}, - {wrap(() -> new NmeaDataSourceRT(new NmeaDataSourceVO())), NmeaDataSourceRT.class.getSimpleName()}, - {wrap(() -> new RadiuinoEventDataSource(new RadiuinoDataSourceVO<>())), RadiuinoEventDataSource.class.getSimpleName()}, - {wrap(() -> new RadiuinoPollingDataSource(new RadiuinoDataSourceVO<>())), RadiuinoPollingDataSource.class.getSimpleName()}, - {wrap(() -> new VMStatDataSourceRT(new VMStatDataSourceVO())), VMStatDataSourceRT.class.getSimpleName()}, - {wrap(() -> new ViconicsDataSourceRT(new ViconicsDataSourceVO())), ViconicsDataSourceRT.class.getSimpleName()}, - {wrap(() -> new GalilDataSourceRT(new GalilDataSourceVO())), GalilDataSourceRT.class.getSimpleName()}, - {wrap(() -> new IEC101EthernetDataSource(new IEC101EthernetDataSourceVO())), IEC101EthernetDataSource.class.getSimpleName()}, - {wrap(() -> new IEC101SerialDataSource(new IEC101SerialDataSourceVO())), IEC101SerialDataSource.class.getSimpleName()}, - {wrap(() -> new MessagingDataSourceRT(amqpDataSourceVO, MessagingServiceFactory.newService(amqpDataSourceVO))), AmqpDataSourceVO.class.getSimpleName()}, - {wrap(() -> new MessagingDataSourceRT(mqttDataSourceVO, messageServiceMock)), MqttDataSourceVO.class.getSimpleName()}, - - {wrap(() -> new ModbusSerialDataSource(new ModbusSerialDataSourceVO())), ModbusSerialDataSource.class.getSimpleName()}, - {wrap(() -> new ModbusIpDataSource(modbusIpDataSourceVO)), ModbusIpDataSource.class.getSimpleName()}, - {wrap(() -> new OPCDataSource(new OPCDataSourceVO<>())), OPCDataSource.class.getSimpleName()}, - {wrap(() -> new OneWireDataSourceRT(new OneWireDataSourceVO())), OneWireDataSourceRT.class.getSimpleName()}, - {wrap(() -> new SqlDataSourceRT(new SqlDataSourceVO())), SqlDataSourceRT.class.getSimpleName()}, - {wrap(() -> new HttpReceiverDataSourceRT(new HttpReceiverDataSourceVO())), HttpReceiverDataSourceRT.class.getSimpleName()}, - {wrap(() -> new PachubeDataSourceRT(new PachubeDataSourceVO())), PachubeDataSourceRT.class.getSimpleName()}, - {wrap(() -> new SnmpDataSourceRT(new SnmpDataSourceVO())), SnmpDataSourceRT.class.getSimpleName()}, - {wrap(() -> new PersistentDataSourceRT(persistentDataSourceVO)), PersistentDataSourceRT.class.getSimpleName()}, + {supplier(() -> new ASCIISerialDataSource(new ASCIISerialDataSourceVO<>())), ASCIISerialDataSource.class.getSimpleName()}, + {supplier(() -> new Alpha2DataSource(new Alpha2DataSourceVO<>())), Alpha2DataSource.class.getSimpleName()}, + {supplier(() -> new BACnetIPDataSourceRT(baCnetIPDataSourceVO)), BACnetIPDataSourceRT.class.getSimpleName()}, + {supplier(() -> new Dnp3IpDataSource(new Dnp3IpDataSourceVO())), Dnp3IpDataSource.class.getSimpleName()}, + {supplier(() -> new Dnp3SerialDataSource(new Dnp3SerialDataSourceVO())), Dnp3SerialDataSource.class.getSimpleName()}, + {supplier(() -> new DrStorageHt5bDataSource(new DrStorageHt5bDataSourceVO<>())), DrStorageHt5bDataSource.class.getSimpleName()}, + {supplier(() -> new EBI25DataSourceRT(new EBI25DataSourceVO())), EBI25DataSourceRT.class.getSimpleName()}, + {supplier(() -> new NmeaDataSourceRT(new NmeaDataSourceVO())), NmeaDataSourceRT.class.getSimpleName()}, + {supplier(() -> new RadiuinoEventDataSource(new RadiuinoDataSourceVO<>())), RadiuinoEventDataSource.class.getSimpleName()}, + {supplier(() -> new RadiuinoPollingDataSource(new RadiuinoDataSourceVO<>())), RadiuinoPollingDataSource.class.getSimpleName()}, + {supplier(() -> new VMStatDataSourceRT(new VMStatDataSourceVO())), VMStatDataSourceRT.class.getSimpleName()}, + {supplier(() -> new ViconicsDataSourceRT(new ViconicsDataSourceVO())), ViconicsDataSourceRT.class.getSimpleName()}, + {supplier(() -> new GalilDataSourceRT(new GalilDataSourceVO())), GalilDataSourceRT.class.getSimpleName()}, + {supplier(() -> new IEC101EthernetDataSource(new IEC101EthernetDataSourceVO())), IEC101EthernetDataSource.class.getSimpleName()}, + {supplier(() -> new IEC101SerialDataSource(new IEC101SerialDataSourceVO())), IEC101SerialDataSource.class.getSimpleName()}, + {supplier(() -> new MessagingDataSourceRT(amqpDataSourceVO, MessagingServiceFactory.newService(amqpDataSourceVO))), AmqpDataSourceVO.class.getSimpleName()}, + {supplier(() -> new MessagingDataSourceRT(mqttDataSourceVO, messageServiceMock)), MqttDataSourceVO.class.getSimpleName()}, + + {supplier(() -> new ModbusSerialDataSource(new ModbusSerialDataSourceVO())), ModbusSerialDataSource.class.getSimpleName()}, + {supplier(() -> new ModbusIpDataSource(modbusIpDataSourceVO)), ModbusIpDataSource.class.getSimpleName()}, + {supplier(() -> new OPCDataSource(new OPCDataSourceVO<>())), OPCDataSource.class.getSimpleName()}, + {supplier(() -> new OneWireDataSourceRT(new OneWireDataSourceVO())), OneWireDataSourceRT.class.getSimpleName()}, + {supplier(() -> new SqlDataSourceRT(new SqlDataSourceVO())), SqlDataSourceRT.class.getSimpleName()}, + {supplier(() -> new HttpReceiverDataSourceRT(new HttpReceiverDataSourceVO())), HttpReceiverDataSourceRT.class.getSimpleName()}, + {supplier(() -> new PachubeDataSourceRT(new PachubeDataSourceVO())), PachubeDataSourceRT.class.getSimpleName()}, + {supplier(() -> new SnmpDataSourceRT(new SnmpDataSourceVO())), SnmpDataSourceRT.class.getSimpleName()}, + {supplier(() -> new PersistentDataSourceRT(persistentDataSourceVO)), PersistentDataSourceRT.class.getSimpleName()}, }; } diff --git a/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java b/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java index 227b38bb04..c3b011cebc 100644 --- a/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java +++ b/test/com/serotonin/mango/util/InitializeDataSourceRtMockUtils.java @@ -29,11 +29,12 @@ import com.serotonin.bacnet4j.event.DeviceEventHandler; import com.serotonin.mango.Common; import com.serotonin.mango.rt.dataImage.DataPointRT; -import com.serotonin.mango.rt.dataSource.DataSourceRT; import com.serotonin.mango.rt.dataSource.bacnet.BACnetIPDataSourceRT; import com.serotonin.mango.rt.dataSource.ebro.EBI25Constants; import com.serotonin.mango.rt.dataSource.ebro.EBI25DataSourceRT; import com.serotonin.mango.rt.dataSource.galil.GalilDataSourceRT; +import com.serotonin.mango.rt.dataSource.galil.GalilRequest; +import com.serotonin.mango.rt.dataSource.galil.GalilResponse; import com.serotonin.mango.rt.dataSource.modbus.ModbusDataSource; import com.serotonin.mango.rt.dataSource.modbus.ModbusIpDataSource; import com.serotonin.mango.rt.dataSource.modbus.ModbusSerialDataSource; @@ -46,6 +47,8 @@ import com.serotonin.mango.rt.dataSource.sql.SqlDataSourceRT; import com.serotonin.mango.rt.dataSource.viconics.ViconicsDataSourceRT; import com.serotonin.mango.util.timeout.TimeoutTask; +import com.serotonin.mango.vo.DataPointVO; +import com.serotonin.mango.vo.dataSource.DataSourceVO; import com.serotonin.mango.vo.dataSource.bacnet.BACnetIPDataSourceVO; import com.serotonin.mango.vo.dataSource.ebro.EBI25DataSourceVO; import com.serotonin.mango.vo.dataSource.galil.GalilDataSourceVO; @@ -57,6 +60,8 @@ import com.serotonin.mango.vo.dataSource.snmp.SnmpDataSourceVO; import com.serotonin.mango.vo.dataSource.sql.SqlDataSourceVO; import com.serotonin.mango.vo.dataSource.viconics.ViconicsDataSourceVO; +import com.serotonin.messaging.MessageControl; +import com.serotonin.messaging.StreamTransport; import com.serotonin.modbus4j.ModbusMaster; import com.serotonin.modbus4j.exception.ModbusInitException; import com.serotonin.modbus4j.ip.tcp.TcpMaster; @@ -80,6 +85,8 @@ import java.io.OutputStream; import java.net.Socket; import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.resetUnreliableDataPoints; @@ -236,23 +243,31 @@ public static GalilDataSourceRT createGalil() { return dataSource; } - public static Supplier wrap(Supplier function) { + public static Consumer consumer(Consumer consumer) { + return consumer; + } + + public static Supplier supplier(Supplier function) { return function; } - public static void reset(List list1, List list2, List list3) { + public static > Function function(Function function) { + return function; + } + + public static void resetUnreliable(List list1, List list2, List list3) { resetUnreliableDataPoints(list1); resetUnreliableDataPoints(list2); resetUnreliableDataPoints(list3); } - public static void set(List list1, List list2, List list3) { + public static void setUnreliable(List list1, List list2, List list3) { setUnreliableDataPoints(list1); setUnreliableDataPoints(list2); setUnreliableDataPoints(list3); } - private static void sqlMock(SqlDataSourceRT dataSource) { + public static void sqlMock(SqlDataSourceRT dataSource) { mockStatic(SqlDataSourceUtils.class); JdbcOperations jdbcOperations = mock(JdbcOperations.class); when(jdbcOperations.queryForObject(anyString(), eq(int.class))).thenReturn(1); @@ -264,7 +279,7 @@ private static void sqlMock(SqlDataSourceRT dataSource) { } } - private static void oneWireMock(OneWireDataSourceRT dataSource) { + public static void oneWireMock(OneWireDataSourceRT dataSource) { Network networkMock = mock(Network.class); try { whenNew(Network.class).withAnyArguments() @@ -274,7 +289,7 @@ private static void oneWireMock(OneWireDataSourceRT dataSource) { } } - private static void opcMock(OPCDataSource dataSource) { + public static void opcMock(OPCDataSource dataSource) { RealOPCMaster realOPCMasterMock = mock(RealOPCMaster.class); try { whenNew(RealOPCMaster.class).withAnyArguments() @@ -300,7 +315,7 @@ public static void modbusMock(ModbusDataSource dataSource) { } } - private static void iec101Mock(IEC101DataSource dataSource) { + public static void iec101Mock(IEC101DataSource dataSource) { IEC101Master iec101MasterMock = mock(IEC101Master.class); try { whenNew(IEC101Master.class).withAnyArguments() @@ -310,12 +325,25 @@ private static void iec101Mock(IEC101DataSource dataSource) { } } - private static void galilMock(GalilDataSourceRT dataSource) { + public static void galilMock(GalilDataSourceRT dataSource) { InputStream inputStreamMock = mock(InputStream.class); OutputStream outputStreamMock = mock(OutputStream.class); Socket socketMock = mock(Socket.class); + MessageControl messageControlMock = mock(MessageControl.class); + try { + when(messageControlMock.send(any(GalilRequest.class))) + .thenReturn(new GalilResponse(new byte[]{})); + } catch (IOException e) { + throw new RuntimeException(e); + } + + StreamTransport streamTransportMock = mock(StreamTransport.class); + doAnswer(a -> { + return null; + }).when(streamTransportMock).start(anyString()); + try { doAnswer(a -> { return null; @@ -326,12 +354,18 @@ private static void galilMock(GalilDataSourceRT dataSource) { whenNew(Socket.class).withAnyArguments() .thenReturn(socketMock); + + whenNew(MessageControl.class).withAnyArguments() + .thenReturn(messageControlMock); + + whenNew(StreamTransport.class).withAnyArguments() + .thenReturn(streamTransportMock); } catch (Exception e) { throw new RuntimeException(e); } } - private static void viconicsMock(ViconicsDataSourceRT dataSource) { + public static void viconicsMock(ViconicsDataSourceRT dataSource) { ViconicsNetwork viconicsNetworkMock = mock(ViconicsNetwork.class); try { whenNew(ViconicsNetwork.class).withAnyArguments() @@ -341,7 +375,7 @@ private static void viconicsMock(ViconicsDataSourceRT dataSource) { } } - private static void nmeaMock(NmeaDataSourceRT dataSource) { + public static void nmeaMock(NmeaDataSourceRT dataSource) { NmeaReceiver nmeaReceiverMock = mock(NmeaReceiver.class); TimeoutTask timeoutTaskMock = mock(TimeoutTask.class); try { @@ -354,7 +388,7 @@ private static void nmeaMock(NmeaDataSourceRT dataSource) { } } - private static void ebi25Mock(EBI25DataSourceRT dataSource) { + public static void ebi25Mock(EBI25DataSourceRT dataSource) { ModbusMaster modbusMasterMock = mock(ModbusMaster.class); mockStatic(EBI25Constants.class); try { @@ -365,7 +399,7 @@ private static void ebi25Mock(EBI25DataSourceRT dataSource) { } } - private static void alpha2Mock(Alpha2DataSource dataSource) { + public static void alpha2Mock(Alpha2DataSource dataSource) { Alpha2Master alpha2MasterMock = mock(Alpha2Master.class); try { doAnswer(invocation -> { @@ -379,7 +413,7 @@ private static void alpha2Mock(Alpha2DataSource dataSource) { } } - private static void dnp3Mock(Dnp3DataSource dataSource) { + public static void dnp3Mock(Dnp3DataSource dataSource) { DNP3Master dnp3MasterMock = mock(DNP3Master.class); try { whenNew(DNP3Master.class) @@ -390,7 +424,7 @@ private static void dnp3Mock(Dnp3DataSource dataSource) { } } - private static void bacNetMock(BACnetIPDataSourceRT dataSource) { + public static void bacNetMock(BACnetIPDataSourceRT dataSource) { LocalDevice localDeviceMock = mock(LocalDevice.class); DeviceEventHandler deviceEventHandlerMock = mock(DeviceEventHandler.class); @@ -406,29 +440,29 @@ private static void bacNetMock(BACnetIPDataSourceRT dataSource) { } } - private static void pachubeMock(PachubeDataSourceRT dataSource) { + public static void pachubeMock(PachubeDataSourceRT dataSource) { HttpClient httpClient = mock(HttpClient.class); when(httpClient.getParams()).thenReturn(new HttpClientParams()); mockStatic(Common.class); when(Common.getHttpClient(anyInt())).thenReturn(httpClient); } - private static void asciiSerialMock(ASCIISerialDataSource dataSource) { + public static void asciiSerialMock(ASCIISerialDataSource dataSource) { SerialPort serialPortMock = mock(SerialPort.class); dataSource.setsPort(serialPortMock); } - private static void radiuinoMock(RadiuinoEventDataSource dataSource) { + public static void radiuinoMock(RadiuinoEventDataSource dataSource) { SerialPort serialPortMock = mock(SerialPort.class); dataSource.setsPort(serialPortMock); } - private static void radiuinoPollingMock(RadiuinoPollingDataSource dataSource) { + public static void radiuinoPollingMock(RadiuinoPollingDataSource dataSource) { SerialPort serialPortMock = mock(SerialPort.class); dataSource.setsPort(serialPortMock); } - private static void drStorageMock(DrStorageHt5bDataSource dataSource) { + public static void drStorageMock(DrStorageHt5bDataSource dataSource) { SerialPort serialPortMock = mock(SerialPort.class); dataSource.setsPort(serialPortMock); InputStream inputStreamMock = mock(InputStream.class); From 1c6aee4f39582bf5aa7345ae64387b0eb621be45 Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Wed, 28 Feb 2024 11:09:04 +0100 Subject: [PATCH 19/63] #2755 Signaling the data source that has a problem: - added class: RuntimeMockUtils --- test/utils/mock/RuntimeMockUtils.java | 61 +++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 test/utils/mock/RuntimeMockUtils.java diff --git a/test/utils/mock/RuntimeMockUtils.java b/test/utils/mock/RuntimeMockUtils.java new file mode 100644 index 0000000000..347a4e6c5f --- /dev/null +++ b/test/utils/mock/RuntimeMockUtils.java @@ -0,0 +1,61 @@ +package utils.mock; + +import com.serotonin.mango.Common; +import com.serotonin.mango.rt.EventManager; +import com.serotonin.mango.rt.RuntimeManager; +import com.serotonin.mango.rt.maint.BackgroundProcessing; +import com.serotonin.mango.web.ContextWrapper; +import org.powermock.api.mockito.PowerMockito; +import org.scada_lts.dao.SystemSettingsDAO; +import org.scada_lts.mango.service.DataPointService; +import org.scada_lts.mango.service.DataSourceService; +import org.scada_lts.mango.service.PointValueService; +import org.scada_lts.mango.service.SystemSettingsService; +import org.scada_lts.web.beans.ApplicationBeans; +import org.scada_lts.web.ws.services.DataPointServiceWebSocket; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.powermock.api.mockito.PowerMockito.*; +import static org.powermock.api.mockito.PowerMockito.when; + +public final class RuntimeMockUtils { + + private RuntimeMockUtils() {} + + public static void runtimeManagerMock(RuntimeManager runtimeManager, EventManager eventManager) throws Exception { + + DataSourceService dataSourceService = PowerMockito.mock(DataSourceService.class); + whenNew(DataSourceService.class).withNoArguments().thenReturn(dataSourceService); + + DataPointService dataPointService = PowerMockito.mock(DataPointService.class); + whenNew(DataPointService.class).withNoArguments().thenReturn(dataPointService); + + SystemSettingsService systemSettingsService = PowerMockito.mock(SystemSettingsService.class); + whenNew(SystemSettingsService.class).withNoArguments().thenReturn(systemSettingsService); + + SystemSettingsDAO systemSettingsDAO = PowerMockito.mock(SystemSettingsDAO.class); + whenNew(SystemSettingsDAO.class).withNoArguments().thenReturn(systemSettingsDAO); + + mockStatic(SystemSettingsDAO.class); + when(SystemSettingsDAO.getValue(anyString())).thenReturn(""); + when(SystemSettingsDAO.getFutureDateLimit()).thenReturn(1L); + + PointValueService mangoPointValues = PowerMockito.mock(PointValueService.class); + whenNew(PointValueService.class).withNoArguments().thenReturn(mangoPointValues); + + mockStatic(ApplicationBeans.class); + DataPointServiceWebSocket dataPointServiceWebSocket = PowerMockito.mock(DataPointServiceWebSocket.class); + when(ApplicationBeans.getDataPointServiceWebSocketBean()).thenReturn(dataPointServiceWebSocket); + + ContextWrapper contextWrapper = PowerMockito.mock(ContextWrapper.class); + BackgroundProcessing backgroundProcessing = PowerMockito.mock(BackgroundProcessing.class); + + when(contextWrapper.getRuntimeManager()).thenReturn(runtimeManager); + when(contextWrapper.getEventManager()).thenReturn(eventManager); + when(contextWrapper.getBackgroundProcessing()).thenReturn(backgroundProcessing); + + Common.ctx = contextWrapper; + Common.timer.init(); + + } +} From aa20f4b1226a7a29e7c9bba3231a68a17037b948 Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Wed, 28 Feb 2024 11:46:57 +0100 Subject: [PATCH 20/63] #2755 Signaling the data source that has a problem: - fixed generate many events by: Pop3DataSourceRT, PachubeDataSourceRT, NmeaDataSourceRT, HttpRetrieverDataSourceRT, BACnetIPDataSourceRT, change to active events; - change logging fatal to debug level in methods: MBusDataSourceRT.initialize(), MBusDataSourceRT.terminate(); - fixed DataPointUnreliableUtilsTest, InitializeDataSourceRtTest, InitializeWithErrorsDataSourceRtTest, mocking TimeoutTask; --- .../dataSource/bacnet/BACnetIPDataSourceRT.java | 6 +++--- .../http/HttpRetrieverDataSourceRT.java | 2 +- .../rt/dataSource/mbus/MBusDataSourceRT.java | 4 ++-- .../rt/dataSource/nmea/NmeaDataSourceRT.java | 4 +++- .../dataSource/pachube/PachubeDataSourceRT.java | 2 +- .../rt/dataSource/pop3/Pop3DataSourceRT.java | 16 +++++++++------- .../dataSource/DataPointUnreliableUtilsTest.java | 2 +- .../dataSource/InitializeDataSourceRtTest.java | 7 +++++-- .../InitializeWithErrorsDataSourceRtTest.java | 13 ++++++++++++- test/utils/mock/RuntimeMockUtils.java | 5 +++++ 10 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java index db191de006..c7d156fc65 100644 --- a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java @@ -674,15 +674,15 @@ private void fireMessageExceptionEvent(Throwable t) { } private void fireMessageExceptionEvent(String key, String... args) { - raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, (Object[]) args)); + raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage(key, (Object[]) args)); } private void fireMessageExceptionEvent(DataPointRT dataPointRT, String key, String... args) { - raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, (Object[]) args), dataPointRT); + raiseEvent(MESSAGE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage(key, (Object[]) args), dataPointRT); } private void fireDeviceExceptionEvent(DataPointRT dataPointRT, String key, String... args) { - raiseEvent(DEVICE_EXCEPTION_EVENT, System.currentTimeMillis(), false, new LocalizableMessage(key, (Object[]) args), dataPointRT); + raiseEvent(DEVICE_EXCEPTION_EVENT, System.currentTimeMillis(), true, new LocalizableMessage(key, (Object[]) args), dataPointRT); } private void returnToNormal() { diff --git a/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java index 556a8ad05a..50ac0ebed0 100644 --- a/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/http/HttpRetrieverDataSourceRT.java @@ -125,7 +125,7 @@ protected void doPoll(long time) { } if (parseErrorMessage != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseErrorMessage); + raiseEvent(PARSE_EXCEPTION_EVENT, time, true, parseErrorMessage); else returnToNormal(PARSE_EXCEPTION_EVENT, time); } diff --git a/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java index b6d687fed2..72e673ab08 100644 --- a/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/mbus/MBusDataSourceRT.java @@ -61,13 +61,13 @@ public MBusDataSourceRT(MBusDataSourceVO vo) { @Override public void initialize() { - LOG.fatal("INITIALIZE MBusaDataSourceRT" + Thread.getAllStackTraces().get(Thread.currentThread())); + LOG.debug("INITIALIZE MBusaDataSourceRT" + Thread.getAllStackTraces().get(Thread.currentThread())); super.initialize(); } @Override public void terminate() { - LOG.fatal("TERMINATE MBusaDataSourceRT" + Thread.getAllStackTraces().get(Thread.currentThread())); + LOG.debug("TERMINATE MBusaDataSourceRT" + Thread.getAllStackTraces().get(Thread.currentThread())); super.terminate(); } diff --git a/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java index 1a958bd4c1..b48c6247ae 100644 --- a/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/nmea/NmeaDataSourceRT.java @@ -135,7 +135,9 @@ public void receivedMessage(NmeaMessage message) { } if (parseError != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseError); + raiseEvent(PARSE_EXCEPTION_EVENT, time, true, parseError); + else + returnToNormal(PARSE_EXCEPTION_EVENT, time); } private void receivedMessageImpl(DataPointRT dp, NmeaMessage message, long time) throws Exception { diff --git a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java index 0f4e8f16e3..140ca7cce5 100644 --- a/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/pachube/PachubeDataSourceRT.java @@ -212,7 +212,7 @@ protected void pollFeed(int feedId, List points, long time) { } if (parseErrorMessage != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseErrorMessage); + raiseEvent(PARSE_EXCEPTION_EVENT, time, true, parseErrorMessage); else returnToNormal(PARSE_EXCEPTION_EVENT, time); } diff --git a/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java index 92a79326b9..99d30e1292 100644 --- a/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/pop3/Pop3DataSourceRT.java @@ -123,19 +123,21 @@ protected void doPoll(long time) { returnToNormal(INBOX_EXCEPTION_EVENT, time); if (messagesRead) { - if (messageReadError != null) - raiseEvent(MESSAGE_READ_EXCEPTION_EVENT, time, false, messageReadError); - else + if (messageReadError != null) { + raiseEvent(MESSAGE_READ_EXCEPTION_EVENT, time, true, messageReadError); + return; + } else returnToNormal(MESSAGE_READ_EXCEPTION_EVENT, time); - if (parseError != null) - raiseEvent(PARSE_EXCEPTION_EVENT, time, false, parseError); - else + if (parseError != null) { + raiseEvent(PARSE_EXCEPTION_EVENT, time, true, parseError); + return; + } else returnToNormal(PARSE_EXCEPTION_EVENT, time); } } catch (Exception e) { - raiseEvent(INBOX_EXCEPTION_EVENT, time, false, new LocalizableMessage("common.default", e.getMessage())); + raiseEvent(INBOX_EXCEPTION_EVENT, time, true, new LocalizableMessage("common.default", e.getMessage())); } finally { try { diff --git a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java index 4cdb810e19..167ebcd17a 100644 --- a/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java +++ b/test/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtilsTest.java @@ -42,7 +42,7 @@ @RunWith(PowerMockRunner.class) @PrepareForTest({WebContextFactory.class, Common.class, MiscDwr.class, SystemSettingsDAO.class, ContentGenerator.class, PointValueCache.class, DataPointRT.class, RuntimeManager.class, DataPointDao.class, - PointValueDao.class, ApplicationBeans.class}) + PointValueDao.class, ApplicationBeans.class, PollingDataSource.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class DataPointUnreliableUtilsTest { diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java index 2be4d05b89..1c004ab372 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTest.java @@ -41,6 +41,7 @@ import com.serotonin.mango.rt.dataSource.vmstat.VMStatDataSourceRT; import com.serotonin.mango.util.InitializeDataSourceRtMockUtils; import com.serotonin.mango.util.SqlDataSourceUtils; +import com.serotonin.mango.util.timeout.TimeoutTask; import com.serotonin.mango.vo.dataSource.http.HttpImageDataSourceVO; import com.serotonin.mango.vo.dataSource.http.HttpRetrieverDataSourceVO; import com.serotonin.mango.vo.dataSource.internal.InternalDataSourceVO; @@ -80,6 +81,8 @@ import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.supplier; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.powermock.api.mockito.PowerMockito.mock; +import static org.powermock.api.mockito.PowerMockito.whenNew; @RunWith(PowerMockRunner.class) @@ -88,7 +91,7 @@ Alpha2Master.class, BACnetIPDataSourceRT.class, Dnp3IpDataSource.class, Dnp3SerialDataSource.class, EBI25DataSourceRT.class, EBI25Constants.class, NmeaDataSourceRT.class, Runtime.class, VMStatDataSourceRT.class, ViconicsDataSourceRT.class, GalilDataSourceRT.class, IEC101EthernetDataSource.class, IEC101SerialDataSource.class, - ModbusFactory.class, OPCDataSource.class, OneWireDataSourceRT.class, SqlDataSourceUtils.class}) + ModbusFactory.class, OPCDataSource.class, OneWireDataSourceRT.class, SqlDataSourceUtils.class, PollingDataSource.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class InitializeDataSourceRtTest { @@ -157,7 +160,7 @@ public InitializeDataSourceRtTest(String name, Supplier mockConfig, int retur private EventManager eventManager; @Before - public void config() throws Exception { + public void config() { eventManager = mock(EventManager.class); HttpReceiverMulticaster multicastListener = mock(HttpReceiverMulticaster.class); diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java index 29bed5ffbc..39c6746c53 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -35,6 +35,7 @@ import com.serotonin.mango.rt.dataSource.sql.SqlDataSourceRT; import com.serotonin.mango.rt.dataSource.viconics.ViconicsDataSourceRT; import com.serotonin.mango.rt.dataSource.vmstat.VMStatDataSourceRT; +import com.serotonin.mango.util.timeout.TimeoutTask; import com.serotonin.mango.vo.dataSource.bacnet.BACnetIPDataSourceVO; import com.serotonin.mango.vo.dataSource.ebro.EBI25DataSourceVO; import com.serotonin.mango.vo.dataSource.galil.GalilDataSourceVO; @@ -75,11 +76,13 @@ import static com.serotonin.mango.util.InitializeDataSourceRtMockUtils.supplier; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import static org.powermock.api.mockito.PowerMockito.mock; +import static org.powermock.api.mockito.PowerMockito.whenNew; @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(Parameterized.class) -@PrepareForTest({Common.class, Runtime.class, VMStatDataSourceRT.class}) +@PrepareForTest({Common.class, Runtime.class, VMStatDataSourceRT.class, PollingDataSource.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class InitializeWithErrorsDataSourceRtTest { @@ -164,6 +167,14 @@ public void config() { dataSourceRT1.initialize(); } + TimeoutTask timeoutTaskMock = mock(TimeoutTask.class); + try { + whenNew(TimeoutTask.class).withAnyArguments() + .thenReturn(timeoutTaskMock); + } catch (Exception e) { + throw new RuntimeException(e); + } + reset(eventManager); if(dataSourceRT instanceof VMStatDataSourceRT) { diff --git a/test/utils/mock/RuntimeMockUtils.java b/test/utils/mock/RuntimeMockUtils.java index 347a4e6c5f..6fd56c22d4 100644 --- a/test/utils/mock/RuntimeMockUtils.java +++ b/test/utils/mock/RuntimeMockUtils.java @@ -4,6 +4,7 @@ import com.serotonin.mango.rt.EventManager; import com.serotonin.mango.rt.RuntimeManager; import com.serotonin.mango.rt.maint.BackgroundProcessing; +import com.serotonin.mango.util.timeout.TimeoutTask; import com.serotonin.mango.web.ContextWrapper; import org.powermock.api.mockito.PowerMockito; import org.scada_lts.dao.SystemSettingsDAO; @@ -54,6 +55,10 @@ public static void runtimeManagerMock(RuntimeManager runtimeManager, EventManage when(contextWrapper.getEventManager()).thenReturn(eventManager); when(contextWrapper.getBackgroundProcessing()).thenReturn(backgroundProcessing); + TimeoutTask timeoutTaskMock = mock(TimeoutTask.class); + whenNew(TimeoutTask.class).withAnyArguments() + .thenReturn(timeoutTaskMock); + Common.ctx = contextWrapper; Common.timer.init(); From 13545b7ee03db74d2edb4de97a1f68e4435188a0 Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Wed, 28 Feb 2024 23:03:04 +0100 Subject: [PATCH 21/63] #2755 Signaling the data source that has a problem: - fixed generate many events by SqlDataSourceRT; --- .../rt/dataSource/DataPointUnreliableUtils.java | 3 ++- .../mango/rt/dataSource/sql/SqlDataSourceRT.java | 12 +++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java index f2f85221d0..56bcf7186a 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java +++ b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java @@ -2,6 +2,7 @@ import com.serotonin.mango.Common; import com.serotonin.mango.rt.dataImage.DataPointRT; +import com.serotonin.mango.util.LoggingUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -46,7 +47,7 @@ private static void unreliable(List dataPoints, boolean unreliable, if(safe > -1) unreliable(metaDataPoints, unreliable, --safe); else { - LOG.warn("The safe counter has been exceeded!"); + LOG.warn("The safe counter has been exceeded!: " + LoggingUtils.dataPointInfo(dataPoint)); setAttributes(filter(metaDataPoints, unreliable), unreliable); } } diff --git a/src/com/serotonin/mango/rt/dataSource/sql/SqlDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/sql/SqlDataSourceRT.java index 8704a971f9..1507d6861a 100644 --- a/src/com/serotonin/mango/rt/dataSource/sql/SqlDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/sql/SqlDataSourceRT.java @@ -99,13 +99,15 @@ else if (locatorVO.getDataTypeId() == DataTypes.IMAGE) { int rows = jdbcOperations.update(locatorVO.getUpdateStatement(), value); if (rows == 0) { raiseEvent(STATEMENT_EXCEPTION_EVENT, valueTime.getTime(), - false, new LocalizableMessage( + true, new LocalizableMessage( "event.sql.noRowsUpdated", dataPoint.getVO() .getName()), dataPoint); - } else + } else { dataPoint.setPointValue(valueTime, source); + returnToNormal(STATEMENT_EXCEPTION_EVENT, valueTime.getTime()); + } } catch (Exception e) { - raiseEvent(STATEMENT_EXCEPTION_EVENT, valueTime.getTime(), false, + raiseEvent(STATEMENT_EXCEPTION_EVENT, valueTime.getTime(), true, new LocalizableMessage("event.sql.setError", dataPoint .getVO().getName(), getExceptionMessage(e)), dataPoint); } @@ -193,6 +195,8 @@ private void updateByColumn(long time, ResultSet rs) throws SQLException { "event.sql.timeNotFound", timeOverride), dp); continue; + } else { + returnToNormal(STATEMENT_EXCEPTION_EVENT, time, dp); } pointTime = getTimeOverride(meta, column, rs, time); @@ -255,6 +259,8 @@ private void updateByRowId(long time, ResultSet rs) throws SQLException { if (!found) raiseEvent(STATEMENT_EXCEPTION_EVENT, time, true, new LocalizableMessage("event.sql.noDataPoint", rowId)); + else + returnToNormal(STATEMENT_EXCEPTION_EVENT, time); } } From 42b5247d3a6958ee23ec81fdb9af56c5d829f67e Mon Sep 17 00:00:00 2001 From: Kamil Date: Thu, 29 Feb 2024 11:07:08 +0100 Subject: [PATCH 22/63] #2755 Signaling the data source that has a problem: - fixed export DrStorageHt5bDataSourceVO by removed @JsonRemoteProperty from validate method; --- .../vo/dataSource/drStorageHt5b/DrStorageHt5bDataSourceVO.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/br/org/scadabr/vo/dataSource/drStorageHt5b/DrStorageHt5bDataSourceVO.java b/src/br/org/scadabr/vo/dataSource/drStorageHt5b/DrStorageHt5bDataSourceVO.java index 78959fe38d..3c1e68168b 100644 --- a/src/br/org/scadabr/vo/dataSource/drStorageHt5b/DrStorageHt5bDataSourceVO.java +++ b/src/br/org/scadabr/vo/dataSource/drStorageHt5b/DrStorageHt5bDataSourceVO.java @@ -108,7 +108,6 @@ public com.serotonin.mango.vo.dataSource.DataSourceVO.Type getType() { @JsonRemoteProperty private boolean quantize; - @JsonRemoteProperty @Override public void validate(DwrResponseI18n response) { super.validate(response); From 692deded7e7bb68ef82c04dfca6e502190c1cb03 Mon Sep 17 00:00:00 2001 From: Kamil Date: Sat, 13 Jul 2024 23:25:33 +0200 Subject: [PATCH 23/63] #2755 Signaling the Data Source that has a problem: - fixed updateAttemptsCounters; - test.failFast, testLogging.exceptionFormat = full; --- build.gradle | 4 +++- .../ds/messaging/MessagingDataSourceRT.java | 13 ++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 4897c7f185..4e92e9b271 100644 --- a/build.gradle +++ b/build.gradle @@ -228,9 +228,11 @@ test { includeTestsMatching "org.scada_lts.utils.BlockingQueuesUtilsTest" } + failFast = true + testLogging { - //exceptionFormat = "full" + exceptionFormat = "full" showStandardStreams = true afterTest { desc, result -> diff --git a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java index 766b935d12..e1d87c2d47 100644 --- a/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java +++ b/src/org/scada_lts/ds/messaging/MessagingDataSourceRT.java @@ -68,6 +68,7 @@ public void setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPo @Override public void initialize() { try { + updateAttemptsCounters.clear(); messagingService.open(); returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis()); } catch (Throwable e) { @@ -91,7 +92,7 @@ public void terminate() { raiseEvent(DATA_SOURCE_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e)); } finally { - updateAttemptsCounters.clear(); + updateAttemptsCounters.values().stream().peek(a -> a.set(0)).close(); } } @@ -119,7 +120,7 @@ public void removeDataPoint(DataPointRT dataPoint) { raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e), dataPoint); } finally { - updateAttemptsCounters.remove(dataPoint.getId()); + updateAttemptsCounters.get(dataPoint.getId()).set(0); } super.removeDataPoint(dataPoint); } @@ -139,15 +140,9 @@ protected void doPoll(long time) { returnToNormal(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), dataPoint); } } catch (Throwable e) { - updateAttemptsCounters.get(dataPoint.getId()).incrementAndGet(); LOG.error(info(e, this), e); - } catch (Exception e) { - LOG.warn(exceptionInfo(e), e); int dataPointId = dataPoint.getId(); - AtomicInteger counter = updateAttemptsCounters.get(dataPointId); - if(counter != null) { - counter.incrementAndGet(); - } + updateAttemptsCounters.computeIfPresent(dataPointId, (a,b) -> {b.incrementAndGet(); return b;}); raiseEvent(DATA_POINT_INIT_EXCEPTION_EVENT, System.currentTimeMillis(), true, getExceptionMessage(e), dataPoint); } From 45c29ccabadd4657b5f162b494cb3e1b13507ad7 Mon Sep 17 00:00:00 2001 From: Kamil Date: Tue, 6 Aug 2024 14:43:17 +0200 Subject: [PATCH 24/63] #2755 Signaling the Data Source that has a problem: - Corrected config log4j2.xml for script: ScriptExecutor, ContextualizedScriptRT; - Added new event type DataSourcePointEventType; - Added migration V2_8_0_1__AddTypeRef3ColumnToEvents; --- WebContent/WEB-INF/snippet/eventList.jsp | 4 + src/br/org/scadabr/api/dao/MangoDaoImpl.java | 2 +- .../serotonin/mango/MangoContextListener.java | 2 + .../serotonin/mango/rt/RuntimeManager.java | 10 +- .../dataSource/DataPointUnreliableUtils.java | 13 +- .../mango/rt/dataSource/DataSourceRT.java | 44 ++-- .../meta/HistoricalMetaPointLocatorRT.java | 26 +-- .../rt/dataSource/meta/MetaDataSourceRT.java | 41 +++- .../dataSource/meta/MetaPointLocatorRT.java | 125 ++++++++--- .../rt/dataSource/meta/ScriptExecutor.java | 40 +++- .../event/type/DataSourcePointEventType.java | 141 ++++++++++++ .../mango/rt/event/type/EventType.java | 57 +++-- .../serotonin/mango/util/LoggingUtils.java | 8 + src/com/serotonin/mango/vo/DataPointVO.java | 2 +- .../mango/vo/dataSource/PointLocatorVO.java | 4 + .../dataSource/meta/MetaPointLocatorVO.java | 13 ++ .../serotonin/mango/vo/event/EventTypeVO.java | 25 ++- .../mango/vo/permission/Permissions.java | 2 + .../mango/web/dwr/DataSourceEditDwr.java | 4 +- src/org/scada_lts/dao/PendingEventsDAO.java | 15 +- src/org/scada_lts/dao/event/EventDAO.java | 35 ++- .../V2_8_0_1__AddTypeRef3ColumnToEvents.java | 38 ++++ .../mango/service/PointValueService.java | 2 +- src/org/scada_lts/utils/EventTypeUtil.java | 5 +- .../scada_lts/utils/MetaDataPointUtils.java | 7 +- .../GenerateAlarmListComponentTest.java | 5 +- .../InitializeDataSourceRtTestsSuite.java | 2 +- .../InitializeWithErrorsDataSourceRtTest.java | 11 +- .../mango/rt/scripting/ScriptTest.java | 8 +- ...jectContextEnableDisableDataPointTest.java | 13 +- ...ectContextEnableDisableDataSourceTest.java | 13 +- ...ptWithObjectContextWriteDataPointTest.java | 8 +- test/messages_de.properties | 106 +++++---- test/messages_en.properties | 106 +++++---- test/messages_es.properties | 90 ++++---- test/messages_fi.properties | 89 ++++---- test/messages_fr.properties | 202 ++++++++++-------- test/messages_lu.properties | 102 +++++---- test/messages_nl.properties | 93 ++++---- test/messages_pl.properties | 117 +++++----- test/messages_pt.properties | 166 +++++++------- test/messages_ru.properties | 78 ++++--- test/messages_zh.properties | 91 ++++---- test/utils/ScriptTestUtils.java | 8 + webapp-resources/log4j2.xml | 7 + webapp-resources/messages_de.properties | 3 +- webapp-resources/messages_en.properties | 3 +- webapp-resources/messages_es.properties | 3 +- webapp-resources/messages_fi.properties | 3 +- webapp-resources/messages_fr.properties | 3 +- webapp-resources/messages_lu.properties | 2 +- webapp-resources/messages_nl.properties | 3 +- webapp-resources/messages_pl.properties | 1 + webapp-resources/messages_pt.properties | 3 +- webapp-resources/messages_ru.properties | 3 +- webapp-resources/messages_zh.properties | 3 +- 56 files changed, 1274 insertions(+), 736 deletions(-) create mode 100644 src/com/serotonin/mango/rt/event/type/DataSourcePointEventType.java create mode 100644 src/org/scada_lts/dao/migration/mysql/V2_8_0_1__AddTypeRef3ColumnToEvents.java diff --git a/WebContent/WEB-INF/snippet/eventList.jsp b/WebContent/WEB-INF/snippet/eventList.jsp index ffc358ac05..9675b81a60 100644 --- a/WebContent/WEB-INF/snippet/eventList.jsp +++ b/WebContent/WEB-INF/snippet/eventList.jsp @@ -112,6 +112,10 @@ + + + + diff --git a/src/br/org/scadabr/api/dao/MangoDaoImpl.java b/src/br/org/scadabr/api/dao/MangoDaoImpl.java index 2e79b56767..036950890e 100644 --- a/src/br/org/scadabr/api/dao/MangoDaoImpl.java +++ b/src/br/org/scadabr/api/dao/MangoDaoImpl.java @@ -1237,7 +1237,7 @@ public int configureDataPoint(int dataSourceId, mangoPoint.setPointLocator(mangoLocator); DwrResponseI18n validate = new DwrResponseI18n(); validate(mangoPoint, validate); - mangoLocator.validate(validate); + mangoLocator.validate(validate, point.getId()); if (validate.getHasMessages()) { throw new ScadaBRAPIException(new APIError( ErrorCode.INVALID_PARAMETER, diff --git a/src/com/serotonin/mango/MangoContextListener.java b/src/com/serotonin/mango/MangoContextListener.java index ed8bf66eeb..c4c11978d4 100644 --- a/src/com/serotonin/mango/MangoContextListener.java +++ b/src/com/serotonin/mango/MangoContextListener.java @@ -365,6 +365,8 @@ private void constantsInitialize(ServletContext ctx) { EventType.EventSources.AUDIT); ctx.setAttribute("constants.EventType.EventSources.MAINTENANCE", EventType.EventSources.MAINTENANCE); + ctx.setAttribute("constants.EventType.EventSources.DATA_SOURCE_POINT", + EventType.EventSources.DATA_SOURCE_POINT); ctx.setAttribute("constants.SystemEventType.TYPE_SYSTEM_STARTUP", SystemEventType.TYPE_SYSTEM_STARTUP); ctx.setAttribute("constants.SystemEventType.TYPE_SYSTEM_SHUTDOWN", diff --git a/src/com/serotonin/mango/rt/RuntimeManager.java b/src/com/serotonin/mango/rt/RuntimeManager.java index 73a02a844e..28292d8dc6 100644 --- a/src/com/serotonin/mango/rt/RuntimeManager.java +++ b/src/com/serotonin/mango/rt/RuntimeManager.java @@ -72,7 +72,6 @@ import com.serotonin.web.i18n.LocalizableException; import com.serotonin.web.i18n.LocalizableMessage; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; import static org.scada_lts.utils.MetaDataPointUtils.isDataPointInContext; import static org.scada_lts.utils.MetaDataPointUtils.isMetaDataPointRT; @@ -498,11 +497,6 @@ private void startDataPoint(DataPointVO vo) { boolean unreliable = dataPoint.isUnreliable(); - if(unreliable) - setUnreliableDataPoint(dataPoint); - else - resetUnreliableDataPoint(dataPoint); - LOG.info("Data point '" + vo.getExtendedName() + "' initialized - unreliable: " + unreliable); } } @@ -1099,7 +1093,7 @@ private void stopPoints() { public List getRunningMetaDataPoints(int dataPointInContextId) { Map dataPoints = new HashMap<>(this.dataPoints); - return filterRunningDataPoints(new ArrayList<>(dataPoints.values()), dataPoint -> isMetaDataPointRT(dataPoint) + return filterRunningDataPoints(dataPoints.values(), dataPoint -> isMetaDataPointRT(dataPoint) && isDataPointInContext(dataPoint, dataPointInContextId)); } @@ -1109,7 +1103,7 @@ private static List filterRunningDataPoints(List dataP .collect(Collectors.toList()); } - private static List filterDataPoints(List dataPoints, Predicate filter) { + private static List filterRunningDataPoints(Collection dataPoints, Predicate filter) { return dataPoints.stream() .filter(filter) .collect(Collectors.toList()); diff --git a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java index 56bcf7186a..3d5a5ee6dc 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java +++ b/src/com/serotonin/mango/rt/dataSource/DataPointUnreliableUtils.java @@ -14,29 +14,30 @@ public final class DataPointUnreliableUtils { private static final Log LOG = LogFactory.getLog(DataPointUnreliableUtils.class); - public static final String ATTR_UNRELIABLE_KEY = "UNRELIABLE"; + private static final String ATTR_UNRELIABLE_KEY = "UNRELIABLE"; + private static final int SAFE = 10; private DataPointUnreliableUtils() {} public static boolean isSetUnreliable(DataPointRT dataPoint, boolean unreliable) { - return dataPoint.getAttribute(ATTR_UNRELIABLE_KEY) != null + return dataPoint.getAttribute(ATTR_UNRELIABLE_KEY) instanceof Boolean && ((boolean) dataPoint.getAttribute(ATTR_UNRELIABLE_KEY)) == unreliable; } public static void setUnreliableDataPoints(List dataPoints) { - unreliable(dataPoints, true, 9); + unreliable(dataPoints, true, SAFE); } public static void setUnreliableDataPoint(DataPointRT dataPoint) { - unreliable(Collections.singletonList(dataPoint), true, 9); + unreliable(Collections.singletonList(dataPoint), true, SAFE); } public static void resetUnreliableDataPoints(List dataPoints) { - unreliable(dataPoints, false, 9); + unreliable(dataPoints, false, SAFE); } public static void resetUnreliableDataPoint(DataPointRT dataPoint) { - unreliable(Collections.singletonList(dataPoint), false, 9); + unreliable(Collections.singletonList(dataPoint), false, SAFE); } private static void unreliable(List dataPoints, boolean unreliable, int safe) { diff --git a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java index 3e95f81a1e..7f3e078caa 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java @@ -18,6 +18,8 @@ */ package com.serotonin.mango.rt.dataSource; +import com.serotonin.mango.rt.event.type.DataSourcePointEventType; +import com.serotonin.mango.vo.DataPointVO; import gnu.io.NoSuchPortException; import gnu.io.PortInUseException; @@ -52,6 +54,7 @@ */ abstract public class DataSourceRT implements ILifecycle { + @Deprecated(since = "2.8.0") public static final String ATTR_UNRELIABLE_KEY = "UNRELIABLE"; private volatile boolean initialized; @@ -85,7 +88,7 @@ abstract public class DataSourceRT implements ILifecycle { public DataSourceRT(DataSourceVO vo) { this.vo = vo; - eventTypes = new ArrayList(); + eventTypes = new ArrayList<>(); for (EventTypeVO etvo : vo.getEventTypes()) eventTypes.add((DataSourceEventType) etvo.createEventType()); } @@ -155,7 +158,20 @@ public static void raiseEvent(String describe, DataSourceVO vo) { private void _raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message) { message = new LocalizableMessage("event.ds", vo.getName(), message); - DataSourceEventType type = getEventType(eventId); + _raiseEvent(eventId, time, rtn, message, -1); + } + + private void _returnToNormal(int eventId, long time) { + _returnToNormal(eventId, time, -1); + } + + private void _raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message, DataPointVO dataPoint) { + message = new LocalizableMessage("event.ds", dataPoint.getExtendedName(), message); + _raiseEvent(eventId, time, rtn, message, dataPoint.getId()); + } + + private void _raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message, int dataPointId) { + DataSourceEventType type = getDataSourceEventType(eventId, dataPointId); Map context = new HashMap(); context.put("dataSource", vo); @@ -163,11 +179,17 @@ private void _raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage Common.ctx.getEventManager().raiseEvent(type, time, rtn, type.getAlarmLevel(), message, context); } - private void _returnToNormal(int eventId, long time) { - DataSourceEventType type = getEventType(eventId); + private void _returnToNormal(int eventId, long time, int dataPointId) { + DataSourceEventType type = getDataSourceEventType(eventId, dataPointId); Common.ctx.getEventManager().returnToNormal(type, time); } + private DataSourceEventType getDataSourceEventType(int eventId, int dataPointId) { + if(dataPointId == Common.NEW_ID) + return getEventType(eventId); + return new DataSourcePointEventType(getEventType(eventId), dataPointId); + } + protected void raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message) { _raiseEvent(eventId, time, rtn, message); List dataPoints = getDataPoints(); @@ -175,15 +197,10 @@ protected void raiseEvent(int eventId, long time, boolean rtn, LocalizableMessag } protected void raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message, DataPointRT dataPoint) { - _raiseEvent(eventId, time, rtn, message); + _raiseEvent(eventId, time, rtn, message, dataPoint.getVO()); setUnreliableDataPoint(dataPoint); } - protected void raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message, List dataPoints) { - _raiseEvent(eventId, time, rtn, message); - setUnreliableDataPoints(dataPoints); - } - protected void returnToNormal(int eventId, long time) { _returnToNormal(eventId, time); List dataPoints = getDataPoints(); @@ -191,15 +208,10 @@ protected void returnToNormal(int eventId, long time) { } protected void returnToNormal(int eventId, long time, DataPointRT dataPoint) { - _returnToNormal(eventId, time); + _returnToNormal(eventId, time, dataPoint.getId()); resetUnreliableDataPoint(dataPoint); } - protected void returnToNormal(int eventId, long time, List dataPoints) { - _returnToNormal(eventId, time); - resetUnreliableDataPoints(dataPoints); - } - protected DataSourceEventType getEventType(int eventId) { for (DataSourceEventType et : eventTypes) { if (et.getDataSourceEventTypeId() == eventId) diff --git a/src/com/serotonin/mango/rt/dataSource/meta/HistoricalMetaPointLocatorRT.java b/src/com/serotonin/mango/rt/dataSource/meta/HistoricalMetaPointLocatorRT.java index ec13289060..4f8a130b69 100644 --- a/src/com/serotonin/mango/rt/dataSource/meta/HistoricalMetaPointLocatorRT.java +++ b/src/com/serotonin/mango/rt/dataSource/meta/HistoricalMetaPointLocatorRT.java @@ -1,19 +1,12 @@ package com.serotonin.mango.rt.dataSource.meta; -import java.util.HashMap; - -import com.serotonin.db.IntValuePair; -import com.serotonin.mango.db.dao.DataPointDao; -import com.serotonin.mango.db.dao.PointValueDao; import com.serotonin.mango.rt.dataImage.DataPointRT; -import com.serotonin.mango.rt.dataImage.HistoricalDataPoint; -import com.serotonin.mango.rt.dataImage.IDataPoint; import com.serotonin.mango.rt.dataImage.PointValueTime; -import com.serotonin.mango.vo.DataPointVO; import com.serotonin.mango.vo.dataSource.meta.MetaPointLocatorVO; import com.serotonin.timer.SimulationTimer; import com.serotonin.web.i18n.LocalizableMessage; +@Deprecated(since = "2.8.0") public class HistoricalMetaPointLocatorRT extends MetaPointLocatorRT { private long updates; @@ -26,16 +19,7 @@ public void initialize(SimulationTimer timer, DataPointRT dataPoint) { this.dataPoint = dataPoint; initialized = true; initializeTimerTask(); - - context = new HashMap(); - DataPointDao dataPointDao = new DataPointDao(); - PointValueDao pointValueDao = new PointValueDao(); - for (IntValuePair contextEntry : vo.getContext()) { - DataPointVO cvo = dataPointDao.getDataPoint(contextEntry.getKey()); - HistoricalDataPoint point = new HistoricalDataPoint(cvo.getId(), cvo.getPointLocator().getDataTypeId(), - timer, pointValueDao); - context.put(contextEntry.getValue(), point); - } + this.context = createContext(dataPoint); } @Override @@ -52,13 +36,13 @@ public long getUpdates() { } @Override - protected void updatePoint(PointValueTime pvt) { - super.updatePoint(pvt); + protected void doUpdate(PointValueTime pvt, DataPointRT dataPoint) { + super.doUpdate(pvt, dataPoint); updates++; } @Override - protected void handleError(long runtime, LocalizableMessage message) { + protected void handleScriptError(long runtime, DataPointRT dataPoint, LocalizableMessage message) { throw new MetaPointExecutionException(message); } } diff --git a/src/com/serotonin/mango/rt/dataSource/meta/MetaDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/meta/MetaDataSourceRT.java index bb609ca0af..1e1761dea7 100644 --- a/src/com/serotonin/mango/rt/dataSource/meta/MetaDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/meta/MetaDataSourceRT.java @@ -31,6 +31,8 @@ import com.serotonin.mango.vo.dataSource.meta.MetaDataSourceVO; import com.serotonin.web.i18n.LocalizableMessage; +import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.*; + /** * @author Matthew Lohbihler */ @@ -40,6 +42,7 @@ public class MetaDataSourceRT extends DataSourceRT { public static final int EVENT_TYPE_RESULT_TYPE_ERROR = 3; private final List points = new CopyOnWriteArrayList(); + @Deprecated(since = "2.8.0") private boolean contextPointDisabledEventActive; public MetaDataSourceRT(MetaDataSourceVO vo) { @@ -59,7 +62,6 @@ public void addDataPoint(DataPointRT dataPoint) { MetaPointLocatorRT locator = dataPoint.getPointLocator(); points.add(dataPoint); locator.initialize(Common.timer, this, dataPoint); - checkForDisabledPoints(); } } @@ -67,7 +69,6 @@ public void addDataPoint(DataPointRT dataPoint) { public void removeDataPoint(DataPointRT dataPoint) { synchronized (pointListChangeLock) { remove(dataPoint); - checkForDisabledPoints(); } } @@ -77,6 +78,7 @@ private void remove(DataPointRT dataPoint) { points.remove(dataPoint); } + @Deprecated(since = "2.8.0") synchronized void checkForDisabledPoints() { DataPointRT problemPoint = null; @@ -101,26 +103,55 @@ synchronized void checkForDisabledPoints() { } public void raiseScriptError(long runtime, DataPointRT dataPoint, LocalizableMessage message) { - if(isNone(EVENT_TYPE_SCRIPT_ERROR)) + if(isNone(EVENT_TYPE_SCRIPT_ERROR)) { + setUnreliableDataPoint(dataPoint); return; + } raiseEvent(EVENT_TYPE_SCRIPT_ERROR, runtime, true, new LocalizableMessage("event.meta.scriptError", dataPoint .getVO().getName(), message), dataPoint); } + public void raiseContextError(long runtime, DataPointRT dataPoint, LocalizableMessage message) { + if(isNone(EVENT_TYPE_CONTEXT_POINT_DISABLED)) { + setUnreliableDataPoint(dataPoint); + return; + } + raiseEvent(EVENT_TYPE_CONTEXT_POINT_DISABLED, runtime, true, message, dataPoint); + } + public void returnToNormalScript(long runtime, DataPointRT dataPoint) { - if(isNone(EVENT_TYPE_SCRIPT_ERROR)) + if(isNone(EVENT_TYPE_SCRIPT_ERROR)) { + resetUnreliableDataPoint(dataPoint); return; + } returnToNormal(EVENT_TYPE_SCRIPT_ERROR, runtime, dataPoint); } + public void returnToNormalContext(long runtime, DataPointRT dataPoint) { + if(isNone(EVENT_TYPE_CONTEXT_POINT_DISABLED)) { + resetUnreliableDataPoint(dataPoint); + return; + } + returnToNormal(EVENT_TYPE_CONTEXT_POINT_DISABLED, runtime, dataPoint); + } public void raiseResultTypeError(long runtime, DataPointRT dataPoint, LocalizableMessage message) { - if(isNone(EVENT_TYPE_RESULT_TYPE_ERROR)) + if(isNone(EVENT_TYPE_RESULT_TYPE_ERROR)) { + setUnreliableDataPoint(dataPoint); return; + } raiseEvent(EVENT_TYPE_RESULT_TYPE_ERROR, runtime, true, new LocalizableMessage("event.meta.typeError", dataPoint.getVO().getName(), message), dataPoint); } + public void returnToNormalType(long runtime, DataPointRT dataPoint) { + if(isNone(EVENT_TYPE_RESULT_TYPE_ERROR)) { + resetUnreliableDataPoint(dataPoint); + return; + } + returnToNormal(EVENT_TYPE_RESULT_TYPE_ERROR, runtime, dataPoint); + } + private boolean isNone(int type) { DataSourceEventType object = getEventType(type); if(object == null) diff --git a/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java b/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java index 4468384123..6fb6476712 100644 --- a/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java +++ b/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java @@ -24,6 +24,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import javax.script.ScriptException; @@ -37,6 +38,7 @@ import com.serotonin.mango.rt.dataImage.PointValueTime; import com.serotonin.mango.rt.dataSource.PointLocatorRT; import com.serotonin.mango.util.DateUtils; +import com.serotonin.mango.util.LoggingUtils; import com.serotonin.mango.vo.dataSource.meta.MetaPointLocatorVO; import com.serotonin.timer.AbstractTimer; import com.serotonin.timer.CronExpression; @@ -47,7 +49,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import static com.serotonin.mango.rt.dataSource.DataPointUnreliableUtils.setUnreliableDataPoint; import static com.serotonin.mango.util.LoggingScriptUtils.generateContext; import static com.serotonin.mango.util.LoggingScriptUtils.infoErrorExecutionScript; import static com.serotonin.mango.util.LoggingScriptUtils.infoErrorInitializationScript; @@ -65,11 +66,14 @@ public class MetaPointLocatorRT extends PointLocatorRT implements DataPointListe AbstractTimer timer; private MetaDataSourceRT dataSource; protected DataPointRT dataPoint; - protected Map context; + protected volatile Map context; boolean initialized; TimerTask timerTask; - private final static Log LOG = LogFactory.getLog(MetaPointLocatorRT.class); + private final AtomicInteger pointInitializedSafe = new AtomicInteger(MAX_RECURSION); + private final AtomicInteger pointTerminatedSafe = new AtomicInteger(MAX_RECURSION); + + private static final Log LOG = LogFactory.getLog(MetaPointLocatorRT.class); public MetaPointLocatorRT(MetaPointLocatorVO vo) { this.vo = vo; @@ -84,6 +88,7 @@ public MetaPointLocatorVO getPointLocatorVO() { return vo; } + @Deprecated(since = "2.8.0") boolean isContextCreated() { return context != null; } @@ -98,7 +103,7 @@ public void initialize(AbstractTimer timer, MetaDataSourceRT dataSource, DataPoi this.dataSource = dataSource; this.dataPoint = dataPoint; - createContext(); + this.context = createContext(dataPoint); // Add listener registrations RuntimeManager rm = Common.ctx.getRuntimeManager(); @@ -108,10 +113,10 @@ public void initialize(AbstractTimer timer, MetaDataSourceRT dataSource, DataPoi rm.addDataPointListener(contextKey.getKey(), this); } - initialized = true; - initializeTimerTask(); + initialized = true; + if(dataPoint.isInitialized() && (vo.getUpdateEvent() == MetaPointLocatorVO.UPDATE_EVENT_CONTEXT_CHANGE || vo.getUpdateEvent() == MetaPointLocatorVO.UPDATE_EVENT_CONTEXT_UPDATE) && !vo.getContext().isEmpty()) { execute(System.currentTimeMillis(), new ArrayList<>(), true, dataPoint); @@ -167,13 +172,43 @@ public void pointBackdated(PointValueTime value) { } public void pointInitialized() { - createContext(); - dataSource.checkForDisabledPoints(); + + context = createContext(dataPoint); + + if(context == null) { + return; + } + + if(pointInitializedSafe.getAndDecrement() < 0) { + LOG.error("Exceeded recursive level: " + LoggingUtils.dataPointInfo(dataPoint)); + pointInitializedSafe.set(MAX_RECURSION); + return; + } + + if(dataPoint.getPointLocator() instanceof MetaPointLocatorRT) { + DataPointListener dataPointListener = Common.ctx.getRuntimeManager().getDataPointListeners(dataPoint.getId()); + if(dataPointListener != null) { + dataPointListener.pointInitialized(); + } + } } public void pointTerminated() { - createContext(); - dataSource.checkForDisabledPoints(); + + context = createContext(dataPoint); + + if(pointTerminatedSafe.getAndDecrement() < 0) { + LOG.error("Exceeded recursive level: " + LoggingUtils.dataPointInfo(dataPoint)); + pointTerminatedSafe.set(MAX_RECURSION); + return; + } + + if(dataPoint.getPointLocator() instanceof MetaPointLocatorRT) { + DataPointListener dataPointListener = Common.ctx.getRuntimeManager().getDataPointListeners(dataPoint.getId()); + if(dataPointListener != null) { + dataPointListener.pointTerminated(); + } + } } // @@ -239,8 +274,8 @@ private void execute(long runtime, List sourceIds) { } private void execute(long runtime, List sourceIds, boolean initializeMode, DataPointRT dataPoint) { - if (context == null) { - setUnreliableDataPoint(dataPoint); + this.context = createContext(dataPoint); + if(context == null) { LOG.warn("MetaPointLocatorRT.context is null, Context: " + generateContext(dataPoint, dataSource)); return; } @@ -253,11 +288,13 @@ private void execute(long runtime, List sourceIds, boolean initializeMo } if (count > MAX_RECURSION) { - handleError(runtime, new LocalizableMessage("event.meta.recursionFailure")); + handleScriptError(runtime, dataPoint, new LocalizableMessage("event.meta.recursionFailure")); String msg = MessageFormat.format("Recursion failure: exceeded MAX_RECURSION: expected <= {0} but was {1}, Context: {2}", String.valueOf(MAX_RECURSION), count, generateContext(dataPoint, dataSource)); LOG.warn(msg); return; + } else { + returnToNormal(runtime, dataPoint); } sourceIds.add(dataPoint.getId()); @@ -267,22 +304,20 @@ private void execute(long runtime, List sourceIds, boolean initializeMo try { PointValueTime valueTime = executor.execute(vo.getScript(), context, timer.currentTimeMillis(), vo.getDataTypeId(), runtime); + returnToNormalType(System.currentTimeMillis(), dataPoint); PointValueTime previousValueTime = dataPoint.getPointValue(); if (valueTime.getValue() == null) - handleError(runtime, new LocalizableMessage("event.meta.nullResult")); + handleScriptError(runtime, dataPoint, new LocalizableMessage("event.meta.nullResult")); else if(isUpdatePoint(initializeMode, valueTime, previousValueTime, vo)) - updatePoint(valueTime); - } - catch (ScriptException e) { - handleError(runtime, new LocalizableMessage("common.default", e.getLocalizedMessage())); + doUpdate(valueTime, dataPoint); + } catch (ScriptException e) { + handleScriptError(runtime, dataPoint, new LocalizableMessage("common.default", e.getLocalizedMessage())); LOG.warn(infoErrorExecutionScript(e, dataPoint, dataSource)); - } - catch (ResultTypeException e) { - handleError(runtime, e.getLocalizableMessage()); + } catch (ResultTypeException e) { + handleTypeError(runtime, dataPoint, e.getLocalizableMessage()); LOG.warn(infoErrorExecutionScript(e, dataPoint, dataSource)); - } - catch (Exception e) { - handleError(runtime, new LocalizableMessage("common.default", e.getMessage())); + } catch (Exception e) { + handleScriptError(runtime, dataPoint, new LocalizableMessage("common.default", e.getMessage())); LOG.warn(infoErrorExecutionScript(e, dataPoint, dataSource)); } } @@ -291,15 +326,21 @@ else if(isUpdatePoint(initializeMode, valueTime, previousValueTime, vo)) } } - private void createContext() { - context = null; + protected Map createContext(DataPointRT dataPoint) { + Map context; try { ScriptExecutor scriptExecutor = new ScriptExecutor(); - context = scriptExecutor.convertContext(vo.getContext()); - returnToNormal(System.currentTimeMillis()); + context = scriptExecutor.convertContext(vo.getContext(), dataPoint.getId()); + returnToNormalContext(System.currentTimeMillis(), dataPoint); + return context; + } catch (DataPointStateException e) { + handleContextError(System.currentTimeMillis(), dataPoint, e.getLocalizableMessage()); + LOG.warn(infoErrorInitializationScript(e, dataPoint, dataSource)); + return null; } catch (Exception e) { - handleError(System.currentTimeMillis(), new LocalizableMessage("common.default", e.getMessage())); + handleContextError(System.currentTimeMillis(), dataPoint, new LocalizableMessage("event.meta.pointUnavailable", dataPoint.getVO().getName())); LOG.warn(infoErrorInitializationScript(e, dataPoint, dataSource)); + return null; } } @@ -329,19 +370,35 @@ private void execute(PointValueTime newValue, boolean initializeMode) { } } - protected void updatePoint(PointValueTime pvt) { + protected void doUpdate(PointValueTime pvt, DataPointRT dataPoint) { dataPoint.updatePointValue(pvt); - returnToNormal(System.currentTimeMillis()); + returnToNormal(System.currentTimeMillis(), dataPoint); } - protected void handleError(long runtime, LocalizableMessage message) { + protected void handleScriptError(long runtime, DataPointRT dataPoint, LocalizableMessage message) { dataSource.raiseScriptError(runtime, dataPoint, message); } - protected void returnToNormal(long runtime) { + protected void handleContextError(long runtime, DataPointRT dataPoint, LocalizableMessage message) { + dataSource.raiseContextError(runtime, dataPoint, message); + } + + protected void returnToNormal(long runtime, DataPointRT dataPoint) { dataSource.returnToNormalScript(runtime, dataPoint); } - + + protected void returnToNormalContext(long runtime, DataPointRT dataPoint) { + dataSource.returnToNormalContext(runtime, dataPoint); + } + + protected void handleTypeError(long runtime, DataPointRT dataPoint, LocalizableMessage message) { + dataSource.raiseResultTypeError(runtime, dataPoint, message); + } + + protected void returnToNormalType(long runtime, DataPointRT dataPoint) { + dataSource.returnToNormalType(runtime, dataPoint); + } + private static boolean isUpdatePoint(boolean initializeMode, PointValueTime valueTime, PointValueTime previousValueTime, MetaPointLocatorVO metaPointLocator) { return !initializeMode || (metaPointLocator.getUpdateEvent() != MetaPointLocatorVO.UPDATE_EVENT_CONTEXT_CHANGE && metaPointLocator.getUpdateEvent() != MetaPointLocatorVO.UPDATE_EVENT_CONTEXT_UPDATE) diff --git a/src/com/serotonin/mango/rt/dataSource/meta/ScriptExecutor.java b/src/com/serotonin/mango/rt/dataSource/meta/ScriptExecutor.java index 99f4ef9a4a..bd0308654c 100644 --- a/src/com/serotonin/mango/rt/dataSource/meta/ScriptExecutor.java +++ b/src/com/serotonin/mango/rt/dataSource/meta/ScriptExecutor.java @@ -28,6 +28,7 @@ import javax.script.ScriptException; +import com.serotonin.mango.util.LoggingUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mozilla.javascript.Context; @@ -64,21 +65,32 @@ public static void setScriptFunctionPath(String path) { SCRIPT_FUNCTION_PATH = path; } - public Map convertContext(List context) + public Map convertContext(List context) throws DataPointStateException { + return convertContext(context, Common.NEW_ID); + } + + public Map convertContext(List context, int dataPointId) throws DataPointStateException { RuntimeManager rtm = Common.ctx.getRuntimeManager(); Map converted = new HashMap(); for (IntValuePair contextEntry : context) { - DataPointRT point = rtm.getDataPoint(contextEntry.getKey()); - if (point == null) { - LOG.error("Error DataPointRT null " - + new Exception("key:" + contextEntry.getKey() - + " value:" + contextEntry.getValue())); - throw new DataPointStateException(contextEntry.getKey(), - new LocalizableMessage("event.meta.pointMissing")); + if(dataPointId == Common.NEW_ID || dataPointId != contextEntry.getKey()) { + DataPointRT point = rtm.getDataPoint(contextEntry.getKey()); + if (point == null) { + LOG.error("Error DataPointRT null " + + new Exception("key:" + contextEntry.getKey() + + " value:" + contextEntry.getValue())); + throw createPointUnavailableException(contextEntry); + } + if (point.isUnreliable()) { + LOG.warn("Error DataPointRT is unavailable " + + new Exception("key:" + contextEntry.getKey() + + " value:" + contextEntry.getValue()) + " - " + LoggingUtils.dataPointInfo(point)); + throw createPointUnavailableException(contextEntry, point); + } + converted.put(contextEntry.getValue(), point); } - converted.put(contextEntry.getValue(), point); } return converted; @@ -336,4 +348,14 @@ private static void ensureFunctions() { FUNCTIONS = sw.toString(); } } + + private static DataPointStateException createPointUnavailableException(IntValuePair contextEntry, DataPointRT point) { + return new DataPointStateException(contextEntry.getKey(), + new LocalizableMessage("event.meta.pointUnavailable", point.getVO().getExtendedName())); + } + + private static DataPointStateException createPointUnavailableException(IntValuePair contextEntry) { + return new DataPointStateException(contextEntry.getKey(), + new LocalizableMessage("validate.invalidVariable", LoggingUtils.varInfo(contextEntry))); + } } diff --git a/src/com/serotonin/mango/rt/event/type/DataSourcePointEventType.java b/src/com/serotonin/mango/rt/event/type/DataSourcePointEventType.java new file mode 100644 index 0000000000..77cc411561 --- /dev/null +++ b/src/com/serotonin/mango/rt/event/type/DataSourcePointEventType.java @@ -0,0 +1,141 @@ +/* + Mango - Open Source M2M - http://mango.serotoninsoftware.com + Copyright (C) 2006-2011 Serotonin Software Technologies Inc. + @author Matthew Lohbihler + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +package com.serotonin.mango.rt.event.type; + +import com.serotonin.json.JsonException; +import com.serotonin.json.JsonObject; +import com.serotonin.json.JsonReader; +import com.serotonin.json.JsonRemoteEntity; +import com.serotonin.mango.vo.DataPointVO; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.scada_lts.mango.service.DataPointService; + +import java.util.Map; +import java.util.Objects; + +@JsonRemoteEntity +public class DataSourcePointEventType extends DataSourceEventType { + + private DataSourceEventType dataSourceEventType; + private int dataPointId; + + private final Log LOG = LogFactory.getLog(DataSourcePointEventType.class); + + public DataSourcePointEventType() { + // Required for reflection. + } + + public DataSourcePointEventType(DataSourceEventType dataSourceEventType, int dataPointId) { + this.dataSourceEventType = dataSourceEventType; + this.dataPointId = dataPointId; + } + + @Override + public int getEventSourceId() { + return EventSources.DATA_SOURCE_POINT; + } + + public int getDataSourceEventTypeId() { + return dataSourceEventType.getDataSourceEventTypeId(); + } + + public int getAlarmLevel() { + return dataSourceEventType.getAlarmLevel(); + } + + @Override + public int getDataSourceId() { + return dataSourceEventType.getDataSourceId(); + } + + @Override + public int getDataPointId() { + return dataPointId; + } + + @Override + public String toString() { + return "DataSoureEventType(dataSourceId=" + dataSourceEventType.getDataSourceId() + ", dataPointId=" + dataPointId + ", eventTypeId=" + dataSourceEventType.getDataSourceEventTypeId() + ")"; + } + + @Override + public int getDuplicateHandling() { + return dataSourceEventType.getDuplicateHandling(); + } + + @Override + public int getReferenceId1() { + return dataSourceEventType.getDataSourceId(); + } + + @Override + public int getReferenceId2() { + return dataSourceEventType.getDataSourceEventTypeId(); + } + + @Override + public int getReferenceId3() { + return dataPointId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DataSourcePointEventType that = (DataSourcePointEventType) o; + return dataPointId == that.dataPointId && Objects.equals(dataSourceEventType, that.dataSourceEventType); + } + + @Override + public int hashCode() { + return Objects.hash(dataSourceEventType, dataPointId); + } + + // + // / + // / Serialization + // / + // + @Override + public void jsonSerialize(Map map) { + super.jsonSerialize(map); + dataSourceEventType.jsonSerialize(map); + DataPointService dataPointService = new DataPointService(); + DataPointVO dataPoint = dataPointService.getDataPoint(dataPointId); + if(dataPoint != null) { + map.put("DATA_POINT_XID", dataPoint.getXid()); + } else { + LOG.error("DataPoint for id: " + dataPointId + " does not exist."); + } + } + + @Override + public void jsonDeserialize(JsonReader reader, JsonObject json) throws JsonException { + super.jsonDeserialize(reader, json); + DataSourceEventType dataSourceEventType = new DataSourceEventType(); + dataSourceEventType.jsonDeserialize(reader, json); + this.dataSourceEventType = dataSourceEventType; + + DataPointVO dataPoint = getDataPoint(json, "DATA_POINT_XID"); + if(dataPoint != null) { + dataPointId = dataPoint.getId(); + } + } +} diff --git a/src/com/serotonin/mango/rt/event/type/EventType.java b/src/com/serotonin/mango/rt/event/type/EventType.java index b1b627636a..e35e0745a0 100644 --- a/src/com/serotonin/mango/rt/event/type/EventType.java +++ b/src/com/serotonin/mango/rt/event/type/EventType.java @@ -27,7 +27,6 @@ import com.serotonin.json.JsonSerializable; import com.serotonin.mango.db.dao.CompoundEventDetectorDao; import com.serotonin.mango.db.dao.DataPointDao; -import com.serotonin.mango.db.dao.DataSourceDao; import com.serotonin.mango.db.dao.MaintenanceEventDao; import com.serotonin.mango.db.dao.PublisherDao; import com.serotonin.mango.db.dao.ScheduledEventDao; @@ -40,6 +39,8 @@ import com.serotonin.mango.vo.event.MaintenanceEventVO; import com.serotonin.mango.vo.event.ScheduledEventVO; import com.serotonin.mango.vo.publish.PublisherVO; +import org.scada_lts.mango.service.DataPointService; +import org.scada_lts.mango.service.DataSourceService; /** * An event class specifies the type of event that was raised. @@ -102,6 +103,8 @@ public interface EventSources { * Maintenance events are created when maintenance mode becomes active. See MaintenanceVO for more information. */ int MAINTENANCE = 9; + + int DATA_SOURCE_POINT = 10; } public static final ExportCodes SOURCE_CODES = new ExportCodes(); @@ -114,6 +117,7 @@ public interface EventSources { SOURCE_CODES.addElement(EventSources.PUBLISHER, "PUBLISHER"); SOURCE_CODES.addElement(EventSources.AUDIT, "AUDIT"); SOURCE_CODES.addElement(EventSources.MAINTENANCE, "MAINTENANCE"); + SOURCE_CODES.addElement(EventSources.DATA_SOURCE_POINT, "DATA_SOURCE_POINT"); } /** @@ -225,6 +229,10 @@ public int getSystemEventTypeId() { abstract public int getReferenceId2(); + public int getReferenceId3() { + return -1; + } + /** * Determines if the notification of this event to the given user should be suppressed. Useful if the action of the * user resulted in the event being raised. @@ -276,9 +284,7 @@ protected int getInt(JsonObject json, String name, ExportCodes codes) throws Jso // } // protected int getCompoundEventDetectorId(JsonObject json, String name) throws JsonException { - String xid = json.getString(name); - if (xid == null) - throw new LocalizableJsonException("emport.error.eventType.missing.reference", name); + String xid = getXid(json, name); CompoundEventDetectorVO ced = new CompoundEventDetectorDao().getCompoundEventDetector(xid); if (ced == null) throw new LocalizableJsonException("emport.error.eventType.invalid.reference", name, xid); @@ -296,9 +302,7 @@ protected int getCompoundEventDetectorId(JsonObject json, String name) throws Js // } // protected int getScheduledEventId(JsonObject json, String name) throws JsonException { - String xid = json.getString(name); - if (xid == null) - throw new LocalizableJsonException("emport.error.eventType.missing.reference", name); + String xid = getXid(json, name); ScheduledEventVO se = new ScheduledEventDao().getScheduledEvent(xid); if (se == null) throw new LocalizableJsonException("emport.error.eventType.invalid.reference", name, xid); @@ -306,9 +310,7 @@ protected int getScheduledEventId(JsonObject json, String name) throws JsonExcep } protected int getDataPointId(JsonObject json, String name) throws JsonException { - String xid = json.getString(name); - if (xid == null) - throw new LocalizableJsonException("emport.error.eventType.missing.reference", name); + String xid = getXid(json, name); DataPointVO dp = new DataPointDao().getDataPoint(xid); if (dp == null) throw new LocalizableJsonException("emport.error.eventType.invalid.reference", name, xid); @@ -330,9 +332,7 @@ protected int getPointEventDetectorId(JsonObject json, String dpName, String ped } protected int getPointEventDetectorId(JsonObject json, int dpId, String pedName) throws JsonException { - String pedXid = json.getString(pedName); - if (pedXid == null) - throw new LocalizableJsonException("emport.error.eventType.missing.reference", pedName); + String pedXid = getXid(json, pedName); int id = new DataPointDao().getDetectorId(pedXid, dpId); if (id == -1) throw new LocalizableJsonException("emport.error.eventType.invalid.reference", pedName, pedXid); @@ -341,19 +341,25 @@ protected int getPointEventDetectorId(JsonObject json, int dpId, String pedName) } protected DataSourceVO getDataSource(JsonObject json, String name) throws JsonException { - String xid = json.getString(name); - if (xid == null) - throw new LocalizableJsonException("emport.error.eventType.missing.reference", name); - DataSourceVO ds = new DataSourceDao().getDataSource(xid); + String xid = getXid(json, name); + DataSourceService dataSourceService = new DataSourceService(); + DataSourceVO ds = dataSourceService.getDataSource(xid); if (ds == null) throw new LocalizableJsonException("emport.error.eventType.invalid.reference", name, xid); return ds; } + protected DataPointVO getDataPoint(JsonObject json, String name) throws JsonException { + String xid = getXid(json, name); + DataPointService dataPointService = new DataPointService(); + DataPointVO dataPoint = dataPointService.getDataPoint(xid); + if (dataPoint == null) + throw new LocalizableJsonException("emport.error.eventType.invalid.reference", name, xid); + return dataPoint; + } + protected PublisherVO getPublisher(JsonObject json, String name) throws JsonException { - String xid = json.getString(name); - if (xid == null) - throw new LocalizableJsonException("emport.error.eventType.missing.reference", name); + String xid = getXid(json, name); PublisherVO pb = new PublisherDao().getPublisher(xid); if (pb == null) throw new LocalizableJsonException("emport.error.eventType.invalid.reference", name, xid); @@ -361,12 +367,17 @@ protected PublisherVO getPublisher(JsonObject json, String name) throws JsonE } protected int getMaintenanceEventId(JsonObject json, String name) throws JsonException { - String xid = json.getString(name); - if (xid == null) - throw new LocalizableJsonException("emport.error.eventType.missing.reference", name); + String xid = getXid(json, name); MaintenanceEventVO me = new MaintenanceEventDao().getMaintenanceEvent(xid); if (me == null) throw new LocalizableJsonException("emport.error.eventType.invalid.reference", name, xid); return me.getId(); } + + private static String getXid(JsonObject json, String name) throws LocalizableJsonException { + String xid = json.getString(name); + if (xid == null) + throw new LocalizableJsonException("emport.error.eventType.missing.reference", name); + return xid; + } } diff --git a/src/com/serotonin/mango/util/LoggingUtils.java b/src/com/serotonin/mango/util/LoggingUtils.java index 9ff809ed24..9d2052ea0d 100644 --- a/src/com/serotonin/mango/util/LoggingUtils.java +++ b/src/com/serotonin/mango/util/LoggingUtils.java @@ -1,6 +1,7 @@ package com.serotonin.mango.util; import br.org.scadabr.vo.scripting.ScriptVO; +import com.serotonin.db.IntValuePair; import com.serotonin.mango.Common; import com.serotonin.mango.rt.dataImage.DataPointRT; import com.serotonin.mango.rt.dataImage.PointValueTime; @@ -243,6 +244,13 @@ public static String publisherInfo(PublisherVO publisher) { return MessageFormat.format(info, publisher.getName(), publisher.getId(), publisher.getXid(), publisher.getType()); } + public static String varInfo(IntValuePair pair) { + if(pair == null) + return ""; + String info = "{0} (key: {1})"; + return MessageFormat.format(info, pair.getValue(), pair.getKey()); + } + private static String msg(EventHandlerVO eventHandler) { return StringUtils.isEmpty(eventHandler.getAlias()) && eventHandler.getMessage() != null ? eventHandler.getMessage().getLocalizedMessage(Common.getBundle()) : eventHandler.getAlias(); } diff --git a/src/com/serotonin/mango/vo/DataPointVO.java b/src/com/serotonin/mango/vo/DataPointVO.java index 5aa6edef5f..47341e2e44 100644 --- a/src/com/serotonin/mango/vo/DataPointVO.java +++ b/src/com/serotonin/mango/vo/DataPointVO.java @@ -709,7 +709,7 @@ public void validate(DwrResponseI18n response) { if (purgeValuesLimit <= 1) response.addContextualMessage("purgeValuesLimit", "validate.greaterThanOne"); - pointLocator.validate(response); + pointLocator.validate(response, this.getId()); // Check text renderer type if (textRenderer != null && !textRenderer.getDef().supports(pointLocator.getDataTypeId())) diff --git a/src/com/serotonin/mango/vo/dataSource/PointLocatorVO.java b/src/com/serotonin/mango/vo/dataSource/PointLocatorVO.java index 171f88f0b1..4edafc11a3 100644 --- a/src/com/serotonin/mango/vo/dataSource/PointLocatorVO.java +++ b/src/com/serotonin/mango/vo/dataSource/PointLocatorVO.java @@ -61,5 +61,9 @@ public interface PointLocatorVO extends Serializable, ChangeComparableObject { */ public void validate(DwrResponseI18n response); + default void validate(DwrResponseI18n response, int dataPointId) { + validate(response); + } + public DataPointSaveHandler getDataPointSaveHandler(); } diff --git a/src/com/serotonin/mango/vo/dataSource/meta/MetaPointLocatorVO.java b/src/com/serotonin/mango/vo/dataSource/meta/MetaPointLocatorVO.java index ddcbb0f948..3c48b01a59 100644 --- a/src/com/serotonin/mango/vo/dataSource/meta/MetaPointLocatorVO.java +++ b/src/com/serotonin/mango/vo/dataSource/meta/MetaPointLocatorVO.java @@ -174,13 +174,26 @@ public void setUpdateCronPattern(String updateCronPattern) { this.updateCronPattern = updateCronPattern; } + @Override public void validate(DwrResponseI18n response) { + validate(response, Common.NEW_ID); + } + + @Override + public void validate(DwrResponseI18n response, int dataPointId) { if (StringUtils.isEmpty(script)) response.addContextualMessage("script", "validate.required"); List varNameSpace = new ArrayList(); for (IntValuePair point : context) { String varName = point.getValue(); + int pointId = point.getKey(); + + if(pointId != Common.NEW_ID && pointId == dataPointId) { + response.addContextualMessage("context", "validate.invalidVariable", varName); + break; + } + if (StringUtils.isEmpty(varName)) { response.addContextualMessage("context", "validate.allVarNames"); break; diff --git a/src/com/serotonin/mango/vo/event/EventTypeVO.java b/src/com/serotonin/mango/vo/event/EventTypeVO.java index b2db0e3410..e21cc5c95d 100644 --- a/src/com/serotonin/mango/vo/event/EventTypeVO.java +++ b/src/com/serotonin/mango/vo/event/EventTypeVO.java @@ -29,6 +29,7 @@ import com.serotonin.mango.rt.event.type.PublisherEventType; import com.serotonin.mango.rt.event.type.ScheduledEventType; import com.serotonin.mango.rt.event.type.SystemEventType; +import com.serotonin.mango.rt.event.type.DataSourcePointEventType; import com.serotonin.web.i18n.LocalizableMessage; public class EventTypeVO { @@ -45,6 +46,11 @@ public class EventTypeVO { * event, undefined */ private int typeRef2; + + /** + * For data source and data point event, undefined + */ + private int typeRef3; private LocalizableMessage description; private List handlers; private int alarmLevel; @@ -52,20 +58,25 @@ public class EventTypeVO { private int duplicateHandling; public EventTypeVO(int typeId, int typeRef1, int typeRef2) { + this(typeId, typeRef1, typeRef2, -1); + } + + public EventTypeVO(int typeId, int typeRef1, int typeRef2, int typeRef3) { this.typeId = typeId; this.typeRef1 = typeRef1; this.typeRef2 = typeRef2; + this.typeRef3 = typeRef3; } public EventTypeVO(int typeId, int typeRef1, int typeRef2, LocalizableMessage description, int alarmLevel) { - this(typeId, typeRef1, typeRef2); + this(typeId, typeRef1, typeRef2, -1); this.description = description; this.alarmLevel = alarmLevel; } public EventTypeVO(int typeId, int typeRef1, int typeRef2, LocalizableMessage description, int alarmLevel, int duplicateHandling) { - this(typeId, typeRef1, typeRef2); + this(typeId, typeRef1, typeRef2, -1); this.description = description; this.alarmLevel = alarmLevel; this.duplicateHandling = duplicateHandling; @@ -94,6 +105,8 @@ public EventType createEventType() { return new AuditEventType(typeRef1, typeRef2); if (typeId == EventType.EventSources.MAINTENANCE) return new MaintenanceEventType(typeRef1); + if(typeId == EventType.EventSources.DATA_SOURCE_POINT) + return new DataSourcePointEventType(new DataSourceEventType(typeRef1, typeRef2, alarmLevel, duplicateHandling), typeRef3); return null; } @@ -121,6 +134,14 @@ public void setTypeRef2(int typeRef2) { this.typeRef2 = typeRef2; } + public int getTypeRef3() { + return typeRef3; + } + + public void setTypeRef3(int typeRef3) { + this.typeRef3 = typeRef3; + } + public LocalizableMessage getDescription() { return description; } diff --git a/src/com/serotonin/mango/vo/permission/Permissions.java b/src/com/serotonin/mango/vo/permission/Permissions.java index 17369ba9a0..d5ed81e4f4 100644 --- a/src/com/serotonin/mango/vo/permission/Permissions.java +++ b/src/com/serotonin/mango/vo/permission/Permissions.java @@ -287,6 +287,8 @@ public static boolean hasEventTypePermission(User user, EventType eventType) { return hasDataPointReadPermission(user, eventType.getDataSourceId(), eventType.getDataPointId()); case EventType.EventSources.DATA_SOURCE: return hasDataSourcePermission(user, eventType.getDataSourceId()); + case EventType.EventSources.DATA_SOURCE_POINT: + return hasDataSourcePermission(user, eventType.getDataSourceId()) || hasDataPointReadPermission(user, eventType.getDataSourceId(), eventType.getDataPointId()); case EventType.EventSources.SYSTEM: case EventType.EventSources.COMPOUND: case EventType.EventSources.SCHEDULED: diff --git a/src/com/serotonin/mango/web/dwr/DataSourceEditDwr.java b/src/com/serotonin/mango/web/dwr/DataSourceEditDwr.java index fe3f72d89b..e6c084f91a 100644 --- a/src/com/serotonin/mango/web/dwr/DataSourceEditDwr.java +++ b/src/com/serotonin/mango/web/dwr/DataSourceEditDwr.java @@ -343,7 +343,7 @@ private DwrResponseI18n validatePoint(int id, String xid, String name, if (StringUtils.isEmpty(name)) response.addContextualMessage("name", "dsEdit.validate.required"); - locator.validate(response); + locator.validate(response, dp.getId()); if (!response.getHasMessages()) { Common.ctx.getRuntimeManager().saveDataPoint(dp); @@ -2326,7 +2326,7 @@ private DwrResponseI18n validateMultipleDnp3Points(String[] names, DataPointService dataPointService = new DataPointService(); validateXid(response, dataPointService::isXidUnique, dp.getXid(), Common.NEW_ID); - locators[i].validate(response); + locators[i].validate(response, dp.getId()); if (!response.getHasMessages()) { Common.ctx.getRuntimeManager().saveDataPoint(dp); diff --git a/src/org/scada_lts/dao/PendingEventsDAO.java b/src/org/scada_lts/dao/PendingEventsDAO.java index 14f19b659c..41e1a5e069 100644 --- a/src/org/scada_lts/dao/PendingEventsDAO.java +++ b/src/org/scada_lts/dao/PendingEventsDAO.java @@ -49,6 +49,7 @@ public class PendingEventsDAO { private final static String COLUMN_NAME_EVENT_TYPE_ID = "typeId"; private final static String COLUMN_NAME_EVENT_TYPE_REF1 = "typeRef1"; private final static String COLUMN_NAME_EVENT_TYPE_REF2 = "typeRef2"; + private final static String COLUMN_NAME_EVENT_TYPE_REF3 = "typeRef3"; private final static String COLUMN_NAME_EVENT_ACTIVE_TS = "activeTs"; private final static String COLUMN_NAME_EVENT_RTN_APPLICABLE = "rtnApplicable"; private final static String COLUMN_NAME_EVENT_RTN_TS = "rtnTs"; @@ -69,6 +70,7 @@ public class PendingEventsDAO { + "e.typeId, " + "e.typeRef1, " + "e.typeRef2, " + + "e.typeRef3, " + "e.activeTs, " + "e.rtnApplicable, " + "e.rtnTs, " @@ -116,10 +118,7 @@ public List getPendingEvents(int userId, final Map> comments, ResultSet rs) throws SQLException { - int typeId = rs.getInt(COLUMN_NAME_EVENT_TYPE_ID); - int typeRef1 = rs.getInt(COLUMN_NAME_EVENT_TYPE_REF1); - int typeRef2 = rs.getInt(COLUMN_NAME_EVENT_TYPE_REF2); - EventType type = EventTypeUtil.createEventType(typeId,typeRef1,typeRef2); + EventType type = createEventType(rs); long activeTS = rs.getLong(COLUMN_NAME_EVENT_ACTIVE_TS); Boolean rtnApplicable = DAO.charToBool(rs.getString(COLUMN_NAME_EVENT_RTN_APPLICABLE)); int alarmLevel = rs.getInt(COLUMN_NAME_EVENT_ALARM_LEVEL); @@ -166,4 +165,12 @@ private EventInstance mapToEvent(Map> comments, Resul return event; } + + private static EventType createEventType(ResultSet rs) throws SQLException { + int typeId = rs.getInt(COLUMN_NAME_EVENT_TYPE_ID); + int typeRef1 = rs.getInt(COLUMN_NAME_EVENT_TYPE_REF1); + int typeRef2 = rs.getInt(COLUMN_NAME_EVENT_TYPE_REF2); + int typeRef3 = rs.getInt(COLUMN_NAME_EVENT_TYPE_REF3); + return EventTypeUtil.createEventType(typeId, typeRef1, typeRef2, typeRef3); + } } diff --git a/src/org/scada_lts/dao/event/EventDAO.java b/src/org/scada_lts/dao/event/EventDAO.java index 49f34a3707..aa17f8112c 100644 --- a/src/org/scada_lts/dao/event/EventDAO.java +++ b/src/org/scada_lts/dao/event/EventDAO.java @@ -34,6 +34,7 @@ import org.scada_lts.dao.IUserCommentDAO; import org.scada_lts.dao.SerializationData; import com.serotonin.mango.rt.event.type.AuditEventUtils; +import org.scada_lts.utils.EventTypeUtil; import org.scada_lts.utils.QueryUtils; import org.scada_lts.utils.SQLPageWithTotal; import org.scada_lts.web.beans.ApplicationBeans; @@ -76,6 +77,7 @@ public class EventDAO implements GenericDaoCR { private static final String COLUMN_NAME_TYPE_ID = "typeId"; private static final String COLUMN_NAME_TYPE_REF_1 = "typeRef1"; private static final String COLUMN_NAME_TYPE_REF_2 = "typeRef2"; + private static final String COLUMN_NAME_TYPE_REF_3 = "typeRef3"; private static final String COLUMN_NAME_ACTIVE_TS = "activeTs"; private static final String COLUMN_NAME_RTN_APPLICABLE = "rtnApplicable"; private static final String COLUMN_NAME_RTN_TS = "rtnTs"; @@ -126,6 +128,7 @@ public class EventDAO implements GenericDaoCR { "e." + COLUMN_NAME_TYPE_ID + ", " + "e." + COLUMN_NAME_TYPE_REF_1 + ", " + "e." + COLUMN_NAME_TYPE_REF_2 + ", " + + "e." + COLUMN_NAME_TYPE_REF_3 + ", " + "e." + COLUMN_NAME_ACTIVE_TS + ", " + "e." + COLUMN_NAME_RTN_APPLICABLE + ", " + "e." + COLUMN_NAME_RTN_TS + ", " + @@ -144,6 +147,7 @@ public class EventDAO implements GenericDaoCR { + "e."+COLUMN_NAME_TYPE_ID+", " + "e."+COLUMN_NAME_TYPE_REF_1+", " + "e."+COLUMN_NAME_TYPE_REF_2+"," + + "e."+COLUMN_NAME_TYPE_REF_3+", " + "e."+COLUMN_NAME_ACTIVE_TS+"," + "e."+COLUMN_NAME_RTN_APPLICABLE+", " + "e."+COLUMN_NAME_RTN_TS+"," @@ -165,6 +169,7 @@ public class EventDAO implements GenericDaoCR { + "e."+COLUMN_NAME_TYPE_ID+", " + "e."+COLUMN_NAME_TYPE_REF_1+", " + "e."+COLUMN_NAME_TYPE_REF_2+"," + + "e."+COLUMN_NAME_TYPE_REF_3+"," + "e."+COLUMN_NAME_ACTIVE_TS+"," + "e."+COLUMN_NAME_RTN_APPLICABLE+", " + "e."+COLUMN_NAME_RTN_TS+"," @@ -195,7 +200,8 @@ public class EventDAO implements GenericDaoCR { + "insert events (" + COLUMN_NAME_TYPE_ID + "," + COLUMN_NAME_TYPE_REF_1 + "," - + COLUMN_NAME_TYPE_REF_2 + "," + + COLUMN_NAME_TYPE_REF_2 + "," + + COLUMN_NAME_TYPE_REF_3 + "," + COLUMN_NAME_ACTIVE_TS + "," + COLUMN_NAME_RTN_APPLICABLE + "," + COLUMN_NAME_RTN_TS + "," @@ -207,7 +213,7 @@ public class EventDAO implements GenericDaoCR { // userId ? // ack_source ? +") " - + "values (?,?,?,?,?,?,?,?,?,?,?)"; + + "values (?,?,?,?,?,?,?,?,?,?,?,?)"; private static final String EVENT_UPDATE = "" + "update " @@ -267,6 +273,7 @@ public class EventDAO implements GenericDaoCR { + "e."+COLUMN_NAME_TYPE_ID+", " + "e."+COLUMN_NAME_TYPE_REF_1+", " + "e."+COLUMN_NAME_TYPE_REF_2+"," + + "e."+COLUMN_NAME_TYPE_REF_3+"," + "e."+COLUMN_NAME_ACTIVE_TS+"," + "e."+COLUMN_NAME_RTN_APPLICABLE+", " + "e."+COLUMN_NAME_RTN_TS+"," @@ -466,6 +473,7 @@ public class EventDAO implements GenericDaoCR { "e." + COLUMN_NAME_TYPE_ID + ", " + "e." + COLUMN_NAME_TYPE_REF_1 + ", " + "e." + COLUMN_NAME_TYPE_REF_2 + ", " + + "e." + COLUMN_NAME_TYPE_REF_3 + ", " + "e." + COLUMN_NAME_ACTIVE_TS + ", " + "e." + COLUMN_NAME_RTN_APPLICABLE + ", " + "e." + COLUMN_NAME_RTN_TS + ", " + @@ -487,6 +495,7 @@ public class EventDAO implements GenericDaoCR { "e." + COLUMN_NAME_TYPE_ID + ", " + "e." + COLUMN_NAME_TYPE_REF_1 + ", " + "e." + COLUMN_NAME_TYPE_REF_2 + ", " + + "e." + COLUMN_NAME_TYPE_REF_3 + ", " + "e." + COLUMN_NAME_ACTIVE_TS + ", " + "e." + COLUMN_NAME_RTN_APPLICABLE + ", " + "e." + COLUMN_NAME_RTN_TS + ", " + @@ -518,7 +527,7 @@ public class EventDAO implements GenericDaoCR { private static final String STATUS_NORTN_CONDITION_SQL = "e.rtnApplicable='N'"; // @formatter:on - + @Deprecated(since = "2.8.0") //TODO rewrite static EventType createEventType(ResultSet rs, int offset) throws SQLException { @@ -556,7 +565,7 @@ else if (typeId == EventType.EventSources.MAINTENANCE) public static class EventRowMapper implements RowMapper { public EventInstance mapRow(ResultSet rs, int rowNum) throws SQLException { - EventType type = createEventType(rs, 2); + EventType type = createEventType(rs); LocalizableMessage message; LocalizableMessage shortMessage; @@ -575,9 +584,9 @@ public EventInstance mapRow(ResultSet rs, int rowNum) throws SQLException { } EventInstance event = new EventInstance( - type, - rs.getLong(COLUMN_NAME_ACTIVE_TS), - DAO.charToBool(rs.getString(COLUMN_NAME_RTN_APPLICABLE)), + type, + rs.getLong(COLUMN_NAME_ACTIVE_TS), + DAO.charToBool(rs.getString(COLUMN_NAME_RTN_APPLICABLE)), rs.getInt(COLUMN_NAME_ALARM_LEVEL), message, shortMessage, @@ -629,7 +638,7 @@ public UserComment mapRow(ResultSet rs, int rowNum) throws SQLException { //TODO rewrite private class EventTypeRowMapper implements RowMapper { public EventType mapRow(ResultSet rs, int rowNum) throws SQLException { - return createEventType(rs, 1); + return createEventType(rs); } } @@ -736,12 +745,21 @@ public EventCommentDTO mapRow(ResultSet rs, int rowNum) throws SQLException { } } + @Deprecated(since = "2.8.0") private class TotalRowMapper implements RowMapper { public Integer mapRow(ResultSet rs, int rowNum) throws SQLException { return rs.getInt("TOTAL"); } } + private static EventType createEventType(ResultSet rs) throws SQLException { + int typeId = rs.getInt(COLUMN_NAME_TYPE_ID); + int typeRef1 = rs.getInt(COLUMN_NAME_TYPE_REF_1); + int typeRef2 = rs.getInt(COLUMN_NAME_TYPE_REF_2); + int typeRef3 = rs.getInt(COLUMN_NAME_TYPE_REF_3); + return EventTypeUtil.createEventType(typeId, typeRef1, typeRef2, typeRef3); + } + /** * Select from Database Event Rows containing specific Type and Reference * To increase performance there is provided a pagination function. @@ -919,6 +937,7 @@ public PreparedStatement createPreparedStatement(Connection connection) throws S type.getEventSourceId(), type.getReferenceId1(), type.getReferenceId2(), + type.getReferenceId3(), entity.getActiveTimestamp(), DAO.boolToChar(entity.isRtnApplicable()), (!entity.isActive() ? entity.getRtnTimestamp():0), diff --git a/src/org/scada_lts/dao/migration/mysql/V2_8_0_1__AddTypeRef3ColumnToEvents.java b/src/org/scada_lts/dao/migration/mysql/V2_8_0_1__AddTypeRef3ColumnToEvents.java new file mode 100644 index 0000000000..5935bc901d --- /dev/null +++ b/src/org/scada_lts/dao/migration/mysql/V2_8_0_1__AddTypeRef3ColumnToEvents.java @@ -0,0 +1,38 @@ +package org.scada_lts.dao.migration.mysql; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.flywaydb.core.api.migration.BaseJavaMigration; +import org.flywaydb.core.api.migration.Context; +import org.scada_lts.dao.DAO; +import org.springframework.jdbc.core.JdbcTemplate; + +public class V2_8_0_1__AddTypeRef3ColumnToEvents extends BaseJavaMigration { + + private static final Log LOG = LogFactory.getLog(V2_8_0_1__AddTypeRef3ColumnToEvents.class); + + @Override + public void migrate(Context context) throws Exception { + + final JdbcTemplate jdbcTmp = DAO.getInstance().getJdbcTemp(); + + try { + migrate(jdbcTmp); + } catch (Exception ex) { + LOG.error(ex.getMessage(), ex); + throw ex; + } + } + + private void migrate(JdbcTemplate jdbcTmp) { + String sql = "ALTER TABLE events ADD COLUMN typeRef3 int not null"; + try { + jdbcTmp.update(sql); + } catch (Exception ex) { + if(ex.getMessage() != null && !ex.getMessage().contains("Duplicate")) + throw ex; + LOG.warn(ex.getMessage(), ex); + } + } +} + diff --git a/src/org/scada_lts/mango/service/PointValueService.java b/src/org/scada_lts/mango/service/PointValueService.java index 5caa052eb9..747b5a63d6 100644 --- a/src/org/scada_lts/mango/service/PointValueService.java +++ b/src/org/scada_lts/mango/service/PointValueService.java @@ -681,7 +681,7 @@ public void updateMetaDataPointByScript(User user, String xid) { ScriptExecutor scriptExecutor = new ScriptExecutor(); - Map context = scriptExecutor.convertContext(metaPointLocatorVO.getContext()); + Map context = scriptExecutor.convertContext(metaPointLocatorVO.getContext(), dataPoint.getId()); PointValueTime pointValueTime = scriptExecutor.execute(metaPointLocatorVO.getScript(), context, System.currentTimeMillis(), metaPointLocatorVO.getDataTypeId(), System.currentTimeMillis()); Common.ctx.getRuntimeManager().setDataPointValue(dataPoint.getId(), pointValueTime, user); diff --git a/src/org/scada_lts/utils/EventTypeUtil.java b/src/org/scada_lts/utils/EventTypeUtil.java index 61e627f136..8ebdd0caf0 100644 --- a/src/org/scada_lts/utils/EventTypeUtil.java +++ b/src/org/scada_lts/utils/EventTypeUtil.java @@ -29,6 +29,7 @@ import com.serotonin.mango.rt.event.type.PublisherEventType; import com.serotonin.mango.rt.event.type.ScheduledEventType; import com.serotonin.mango.rt.event.type.SystemEventType; +import com.serotonin.mango.rt.event.type.DataSourcePointEventType; /** * Deliver type corresponding with mango. @@ -38,7 +39,7 @@ */ public class EventTypeUtil { - public static EventType createEventType(int typeId, int typeRef1, int typeRef2) + public static EventType createEventType(int typeId, int typeRef1, int typeRef2, int typeRef3) throws SQLException { EventType type; @@ -58,6 +59,8 @@ public static EventType createEventType(int typeId, int typeRef1, int typeRef2) type = new AuditEventType(typeRef1,typeRef2); } else if (typeId == EventType.EventSources.MAINTENANCE) { type = new MaintenanceEventType(typeRef1); + } else if (typeId == EventType.EventSources.DATA_SOURCE_POINT) { + type = new DataSourcePointEventType(new DataSourceEventType(typeRef1, typeRef2), typeRef3); } else { throw new ShouldNeverHappenException("Unknown event type: " + typeId); } diff --git a/src/org/scada_lts/utils/MetaDataPointUtils.java b/src/org/scada_lts/utils/MetaDataPointUtils.java index 6c3486438f..cb0c222341 100644 --- a/src/org/scada_lts/utils/MetaDataPointUtils.java +++ b/src/org/scada_lts/utils/MetaDataPointUtils.java @@ -6,8 +6,6 @@ import com.serotonin.mango.vo.dataSource.meta.MetaPointLocatorVO; import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; public final class MetaDataPointUtils { @@ -20,10 +18,9 @@ public static boolean isDataPointInContext(DataPointRT dataPoint, int dataPointI if(metaPointLocatorRT != null) { MetaPointLocatorVO metaPointLocatorVO = metaPointLocatorRT.getPointLocatorVO(); if(metaPointLocatorVO != null && metaPointLocatorVO.getContext() != null) { - Set keys = metaPointLocatorVO.getContext().stream() + return metaPointLocatorVO.getContext().stream() .map(IntValuePair::getKey) - .collect(Collectors.toSet()); - return keys.contains(dataPointInContextId); + .anyMatch(a -> a == dataPointInContextId); } } } diff --git a/test/br/org/scadabr/view/component/GenerateAlarmListComponentTest.java b/test/br/org/scadabr/view/component/GenerateAlarmListComponentTest.java index 0306b31aa8..4dfb6c313d 100644 --- a/test/br/org/scadabr/view/component/GenerateAlarmListComponentTest.java +++ b/test/br/org/scadabr/view/component/GenerateAlarmListComponentTest.java @@ -70,10 +70,7 @@ public void when_generateContent_with_eventsSubList_after_modifying_events_and_i CopyOnWriteArrayList events = new CopyOnWriteArrayList<>(); when(eventService.getPendingEvents(anyInt())).thenReturn(events); - HashMap model = new HashMap<>(); - whenNew(HashMap.class).withNoArguments().thenReturn(model); - - when(BaseDwr.generateContent(any(), any(), eq(model))) + when(BaseDwr.generateContent(any(), anyString(), anyMap())) .thenAnswer(invocation -> { Map modelArgs = (Map)invocation.getArguments()[2]; List eventsSubList = (List)modelArgs.get("events"); diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java index c8f9356f16..fb1f98a238 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeDataSourceRtTestsSuite.java @@ -6,7 +6,7 @@ @RunWith(Suite.class) @Suite.SuiteClasses({ InitializeDataSourceRtTest.class, - InitializeWithErrorsDataSourceRtTest.class + //InitializeWithErrorsDataSourceRtTest.class }) public class InitializeDataSourceRtTestsSuite { } diff --git a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java index 39c6746c53..085e3130bc 100644 --- a/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java +++ b/test/com/serotonin/mango/rt/dataSource/InitializeWithErrorsDataSourceRtTest.java @@ -69,6 +69,8 @@ import org.scada_lts.ds.messaging.protocol.mqtt.MqttDataSourceVO; import org.scada_lts.ds.messaging.service.MessagingService; import org.scada_lts.ds.messaging.service.MessagingServiceFactory; +import org.scada_lts.web.beans.ApplicationBeans; +import utils.mock.MockUtils; import java.io.IOException; import java.util.function.Supplier; @@ -82,7 +84,7 @@ @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(Parameterized.class) -@PrepareForTest({Common.class, Runtime.class, VMStatDataSourceRT.class, PollingDataSource.class}) +@PrepareForTest({Common.class, Runtime.class, VMStatDataSourceRT.class, PollingDataSource.class, ApplicationBeans.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "org.w3c.*", "com.sun.org.apache.xalan.*", "javax.activation.*", "javax.management.*"}) public class InitializeWithErrorsDataSourceRtTest { @@ -103,6 +105,9 @@ public static Object[][] data() { mqttDataSourceVO.setServerHost("localhost"); mqttDataSourceVO.setServerPortNumber(1234); + ModbusSerialDataSourceVO modbusSerialDataSourceVO = new ModbusSerialDataSourceVO(); + modbusSerialDataSourceVO.setCommPortId("123"); + MessagingService messageServiceMock = mock(MessagingService.class); doAnswer(a -> { throw new MessagingServiceException("From test"); @@ -151,7 +156,9 @@ public InitializeWithErrorsDataSourceRtTest(Supplier createDataSou private EventManager eventManager; @Before - public void config() { + public void config() throws Exception { + + MockUtils.configDaoMock(); eventManager = PowerMockito.mock(EventManager.class); diff --git a/test/com/serotonin/mango/rt/scripting/ScriptTest.java b/test/com/serotonin/mango/rt/scripting/ScriptTest.java index 0c661feb73..809ad9691f 100644 --- a/test/com/serotonin/mango/rt/scripting/ScriptTest.java +++ b/test/com/serotonin/mango/rt/scripting/ScriptTest.java @@ -135,12 +135,14 @@ public ScriptTest(MangoValue mangoValue, this.script = script; } - private RuntimeManager runtimeManager = mock(RuntimeManager.class); - private DPCommandsScriptContextObject scriptContextObject = mock(DPCommandsScriptContextObject.class); + private RuntimeManager runtimeManager; + private DPCommandsScriptContextObject scriptContextObject; @Before public void config() throws Exception { - ScriptTestUtils.configMock(runtimeManager, scriptContextObject); + runtimeManager = mock(RuntimeManager.class); + scriptContextObject = mock(DPCommandsScriptContextObject.class); + ScriptTestUtils.configScriptMock(runtimeManager, scriptContextObject); } @Test diff --git a/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextEnableDisableDataPointTest.java b/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextEnableDisableDataPointTest.java index 92ae1e075c..d82f7e4b65 100644 --- a/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextEnableDisableDataPointTest.java +++ b/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextEnableDisableDataPointTest.java @@ -42,14 +42,17 @@ "javax.activation.*", "javax.management.*"}) public class ScriptWithObjectContextEnableDisableDataPointTest { - private static String pointToChangeXid = "DP_093765"; - private final List objectContext = Arrays.asList(new IntValuePair(2, "dp")); - private RuntimeManager runtimeManager = mock(RuntimeManager.class); - private DPCommandsScriptContextObject scriptContextObject = mock(DPCommandsScriptContextObject.class); + private static final String pointToChangeXid = "DP_093765"; + private List objectContext; + private RuntimeManager runtimeManager; + private DPCommandsScriptContextObject scriptContextObject; @Before public void config() throws Exception { - ScriptTestUtils.configMock(runtimeManager, scriptContextObject); + objectContext = Arrays.asList(new IntValuePair(2, "dp")); + runtimeManager = mock(RuntimeManager.class); + scriptContextObject = mock(DPCommandsScriptContextObject.class); + ScriptTestUtils.configScriptMock(runtimeManager, scriptContextObject); } @After diff --git a/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextEnableDisableDataSourceTest.java b/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextEnableDisableDataSourceTest.java index 87c831c8ad..fb5dcad504 100644 --- a/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextEnableDisableDataSourceTest.java +++ b/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextEnableDisableDataSourceTest.java @@ -39,16 +39,19 @@ "javax.activation.*", "javax.management.*"}) public class ScriptWithObjectContextEnableDisableDataSourceTest { - private static String sourceToChangeXid = "DP_093765"; + private static final String sourceToChangeXid = "DP_093765"; - private final List objectContext = Arrays.asList(new IntValuePair(1, "ds")); + private List objectContext; - private RuntimeManager runtimeManager = mock(RuntimeManager.class); - private DSCommandsScriptContextObject scriptContextObject = mock(DSCommandsScriptContextObject.class); + private RuntimeManager runtimeManager; + private DSCommandsScriptContextObject scriptContextObject; @Before public void config() throws Exception { - ScriptTestUtils.configMock(runtimeManager, scriptContextObject); + objectContext = Arrays.asList(new IntValuePair(2, "ds")); + runtimeManager = mock(RuntimeManager.class); + scriptContextObject = mock(DSCommandsScriptContextObject.class); + ScriptTestUtils.configScriptMock(runtimeManager, scriptContextObject); } @After diff --git a/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextWriteDataPointTest.java b/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextWriteDataPointTest.java index ba02101a6b..2fa57b8a70 100644 --- a/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextWriteDataPointTest.java +++ b/test/com/serotonin/mango/rt/scripting/ScriptWithObjectContextWriteDataPointTest.java @@ -125,12 +125,14 @@ public ScriptWithObjectContextWriteDataPointTest(MangoValue mangoValue, this.script = script; } - private RuntimeManager runtimeManager = mock(RuntimeManager.class); - private DPCommandsScriptContextObject scriptContextObject = mock(DPCommandsScriptContextObject.class); + private RuntimeManager runtimeManager; + private DPCommandsScriptContextObject scriptContextObject; @Before public void config() throws Exception { - ScriptTestUtils.configMock(runtimeManager, scriptContextObject); + runtimeManager = mock(RuntimeManager.class); + scriptContextObject = mock(DPCommandsScriptContextObject.class); + ScriptTestUtils.configScriptMock(runtimeManager, scriptContextObject); } @After diff --git a/test/messages_de.properties b/test/messages_de.properties index f492f3259f..cf9b9a22a7 100644 --- a/test/messages_de.properties +++ b/test/messages_de.properties @@ -756,7 +756,7 @@ dsEdit.mbus.vifeLabel=Vifes dsEdit.mbus.vifeLabels=Vife Label dsEdit.mbus.vifeTypes=Vife Typen dsEdit.meta=Meta Datenquelle -dsEdit.meta.delay=Berechnungsverz\u00f6gerung
+dsEdit.meta.delay=Berechnungsverz\u00f6gerung dsEdit.meta.desc=Meta Datenquelle Konfiguration dsEdit.meta.event=Aktualisierungsereignis dsEdit.meta.event.context=\u00c4nderung der Eingangsvariablen @@ -1160,8 +1160,8 @@ dsEdit.validate.required=Required value dsEdit.viconics=Viconics Wireless Thermostats dsEdit.viconics.channel=Channel dsEdit.viconics.chipRevision=Chip revision -dsEdit.viconics.chipRevisionBr=Chip
revision -dsEdit.viconics.commAddress=Comm
address +dsEdit.viconics.chipRevisionBr=Chip revision +dsEdit.viconics.commAddress=Comm address dsEdit.viconics.convertCelsius=Convert temperatures to celsius dsEdit.viconics.crss=CRSS dsEdit.viconics.dataSourceNotStarted=Data source is not started @@ -1170,9 +1170,9 @@ dsEdit.viconics.deviceRemove=Device remove (s) dsEdit.viconics.deviceWarning=Device offline timeone (s) dsEdit.viconics.devices=Devices dsEdit.viconics.dpconn=Port: {0}, PAN ID: {1}, Channel: {2} -dsEdit.viconics.firmwareRevision=Firmware
revision +dsEdit.viconics.firmwareRevision=Firmware revision dsEdit.viconics.ieee=IEEE -dsEdit.viconics.modelNumber=Model
number +dsEdit.viconics.modelNumber=Model number dsEdit.viconics.networkIdentifyFailure=Network identify failed: {0} dsEdit.viconics.networkInfo=Network information dsEdit.viconics.networkTimeout=Network offline timeout (s) @@ -1186,9 +1186,9 @@ dsEdit.viconics.timeout=Message timeout dsEdit.viconics.trss=TRSS dsEdit.viconics.unreliable=Point value may not be reliable dsEdit.viconics.zigbeeFirmwareRevision=Zigbee firmware revision -dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee
firmware
revision +dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee firmware revision dsEdit.viconics.zigbeeNetworkAddress=Zigbee network address -dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee
network
address +dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee network address dsEdit.virtual=Virtuelle Datenquelle dsEdit.virtual.attractionPoint=Datenpunkt Attraktor dsEdit.virtual.change=\u00c4nderung @@ -1254,17 +1254,17 @@ dsedit.opc.tagName=Tag Tag emport.added=added emport.causedBy=caused by: emport.compoundEvent.prefix=Compound event detector ''{0}'': {1} -emport.compoundEvent.xid=A compound event detector does not have an 'xid' value. Ignored. +emport.compoundEvent.xid=A compound event detector does not have an ’xid’ value. Ignored. emport.confirmImport=Warn: the current database will be erased! Are you sure you want to import a new project? emport.data=Daten emport.dataPoint.badReference=Data point with XID ''{0}'' does not already exist and references a data source that does not exist. Ignored. emport.dataPoint.prefix=Data point ''{0}'': {1} -emport.dataPoint.xid=A data point with name ''{0}'' does not have an 'xid' value. Ignored. +emport.dataPoint.xid=A data point with name ''{0}'' does not have an ’xid’ value. Ignored. emport.dataPoints=Datenpunkte -emport.dataSource.invalidType=Data source with XID ''{0}'' does not already exist and has an invalid 'type' value of ''{1}''. Valid types are {2} -emport.dataSource.missingType=Data source with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} +emport.dataSource.invalidType=Data source with XID ''{0}'' does not already exist and has an invalid ’type’ value of ''{1}''. Valid types are {2} +emport.dataSource.missingType=Data source with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} emport.dataSource.prefix=Datenquelle ''{0}'' : {1} -emport.dataSource.xid=A data source with name ''{0}'' does not have an 'xid' value. Ignored. +emport.dataSource.xid=A data source with name ''{0}'' does not have an ’xid’ value. Ignored. emport.error.alarmLevel=Invalid alarm level ''{0}'' for event ''{1}''. Valid values are {2} emport.error.attractor.missingPoint=Data point with ''{0}'' XID ''{1}'' not found emport.error.chart.invalid=Chart renderer has an invalid ''{0}'' value of ''{1}''. Valid values are {2} @@ -1272,7 +1272,7 @@ emport.error.chart.missing=Chart renderer must have a ''{0}''. Valid values are emport.error.component.imageChart.invalid=Image chart component has an invalid ''{0}'' value of ''{1}''. Valid values are {2} emport.error.component.imageChart.missing=Image chart component must have a ''{0}''. Valid values are {1} emport.error.component.imageIndex=Image index {0} is too high for image set ''{1}''. Valid values are 0 to {2} -emport.error.component.incompatibleDataType=Data point with 'XID' ''{0}'' has a data type that is not compatible with view component type ''{1}'' +emport.error.component.incompatibleDataType=Data point with ’XID’ ''{0}'' has a data type that is not compatible with view component type ''{1}'' emport.error.component.invalid=View component has an invalid ''{0}'' value of ''{1}''. Valid values are {2} emport.error.component.missing=View component must have a ''{0}''. Valid values are {1} emport.error.component.unknownDynamicImage=Dynamic image id ''{0}'' not found. Known dynamic image ids are {1} @@ -1311,7 +1311,7 @@ emport.error.text.missing=Text renderer must have a ''{0}''. Valid values are {1 emport.error.viewShare.missing=Missing ''{0}'' in view share emport.errorMessage=Errors: emport.eventHandler.prefix=Point link ''{0}'': {1} -emport.eventHandler.xid=A point link does not have an 'xid' value. Ignored. +emport.eventHandler.xid=A point link does not have an ’xid’ value. Ignored. emport.export=Export emport.exportDate=Export date emport.exportJson=Generate JSON @@ -1334,29 +1334,29 @@ emport.importProjectTitle=Import Project (Upload) emport.includePointValues=Include point values emport.indent=Einr\u00fcckung emport.invalidFile=File reading failed ({0}) -emport.invalidImportData=Zu importierende Daten sind ung\u00fctig: kein JSON object. +emport.invalidImportData=Zu importierende Daten sind ung\u00fctig: kein JSON object. (www.json.org) emport.invalidProjectName=Invalid name emport.mailingList.prefix=Mailing list ''{0}'': {1} -emport.mailingList.xid=A mailing list does not have an 'xid' value. Ignored. +emport.mailingList.xid=A mailing list does not have an ’xid’ value. Ignored. emport.maintenanceEvent.prefix=Maintenance event ''{0}'': {1} -emport.maintenanceEvent.xid=A maintenance event does not have an 'xid' value. Ignored. +emport.maintenanceEvent.xid=A maintenance event does not have an ’xid’ value. Ignored. emport.noMessages=No result message. Nothing to import? emport.parseError=JSON-Parser Fehler: {0} emport.pointHierarchy.prefix=Datenpunkthierarchie: {0} emport.pointLink.prefix=Point link ''{0}'': {1} -emport.pointLink.xid=A point link does not have an 'xid' value. Ignored. +emport.pointLink.xid=A point link does not have an ’xid’ value. Ignored. emport.pointValue.missingPoint=Point value ''{0}'': Data point not found emport.pointValues=Point values emport.pointValuesMax= Max point values emport.projectDescription=Description emport.projectName=Project name -emport.publisher.invalidType=Publisher with XID ''{0}'' does not already exist and has an invalid 'type' value of ''{1}''. Valid types are {2} -emport.publisher.missingType=Publisher with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} +emport.publisher.invalidType=Publisher with XID ''{0}'' does not already exist and has an invalid ’type’ value of ''{1}''. Valid types are {2} +emport.publisher.missingType=Publisher with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} emport.publisher.prefix=Publisher ''{0}'': {1} -emport.publisher.xid=A data source with name ''{0}'' does not have an 'xid' value. Ignored. +emport.publisher.xid=A data source with name ''{0}'' does not have an ’xid’ value. Ignored. emport.saved=gespeichert emport.scheduledEvent.prefix=Scheduled event ''{0}'': {1} -emport.scheduledEvent.xid=A scheduled event does not have an 'xid' value. Ignored. +emport.scheduledEvent.xid=A scheduled event does not have an ’xid’ value. Ignored. emport.script.prefix=Script ''{0}'': {1} emport.select=Markieren Sie, was Sie exportieren m\u00f6chten emport.selectAll=alles markieren @@ -1367,14 +1367,14 @@ emport.unselectAll=alle Markierungen l\u00f6schen emport.uploadError=Upload failed ({0}) emport.uploadsFolder=Include Uploads folder emport.user.prefix=Benutzer ''{0} : {1} -emport.user.username=A user does not have a 'username' value. Ignored. +emport.user.username=A user does not have a ’username’ value. Ignored. emport.userPermission.prefix=Recte f\u00fcr Benutzer ''{0}'' : {1} -emport.versionError=The project version ({0}) isn't compatible with current system version ({1}) -emport.view.missingType=View with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} +emport.versionError=The project version ({0}) isn’t compatible with current system version ({1}) +emport.view.missingType=View with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} emport.view.prefix=Prozessbild ''{0}'' : {1} -emport.view.xid=A graphical view does not have an 'xid' value. Ignored. +emport.view.xid=A graphical view does not have an ’xid’ value. Ignored. emport.watchList.prefix=Watch list ''{0}'': {1} -emport.watchList.xid=A watch list does not have an 'xid' value. Ignored. +emport.watchList.xid=A watch list does not have an ’xid’ value. Ignored. engUnit.0=square meters engUnit.1=square feet engUnit.10=megavolt amperes @@ -1567,8 +1567,8 @@ engUnit.98=percent engUnit.99=percent per second engUnit.190=kilometers engUnit.abbr.190=km -engUnit.abbr.0=m2 -engUnit.abbr.1=f2 +engUnit.abbr.0=m\u00b2 +engUnit.abbr.1=ft\u00b2 engUnit.abbr.10=megavolt amperes engUnit.abbr.100=per minute engUnit.abbr.101=per second @@ -1789,7 +1789,7 @@ event.alarmMaxDecreased=H\u00f6chste Alarmpriorit\u00e4t verringerte sich von {0 event.alarmMaxIncreased=H\u00f6chste Alarmpriorit\u00e4t erh\u00f6te sich von {0} auf {1} event.audit.added=Benutzer "{0}" erzeugte {1} mit id {2}: {3} event.audit.changed=Benutzer "{0}" \u00e4nderte {1} mit id {2}: {3} -event.audit.changedProperty=
    {0}: "{1}" zu "{2}" +event.audit.changedProperty={0}: "{1}" zu "{2}" event.audit.compoundEventDetector=Compound event detector event.audit.dataPoint=Datenpunkt event.audit.dataSource=Datenquelle @@ -1798,7 +1798,7 @@ event.audit.eventHandler=Event handler event.audit.maintenanceEvent=Maintenance event event.audit.pointEventDetector=Point event detector event.audit.pointLink=Point link -event.audit.property=
    {0}="{1}" +event.audit.property={0}="{1}" event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2053,8 +2053,8 @@ event.valueParse.generalParsePoint={0}, result={1}, point={2} event.valueParse.noData=No data to match against for point {0} event.valueParse.noTime=No time match made {0} event.valueParse.noValue=No value match made for point {0} -event.valueParse.numericParse=Couldn't parse to numeric, result={0} -event.valueParse.numericParsePoint=Couldn't parse to numeric, result={0}, point={1} +event.valueParse.numericParse=Couldn’t parse to numeric, result={0} +event.valueParse.numericParsePoint=Couldn’t parse to numeric, result={0}, point={1} event.valueParse.textParse=Value did not match any multistate text and was not parsable, result={0} event.valueParse.textParsePoint=Value did not match any multistate text and was not parsable, result={0}, point={1} event.valueParse.timeParse=Failed to parse time "{0}" @@ -2093,7 +2093,7 @@ eventHandlers.inactiveNotif=Benachrichtigung Gegangen eventHandlers.inactiveOverride=Override inactive recipients eventHandlers.inactiveRecipients=Inactive recipients eventHandlers.inactiveScript=When inactive script -eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler's inactive list +eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler’s inactive list eventHandlers.invalidActiveSource=Invalid active source point eventHandlers.invalidActiveSourceType=Invalid active source point data type eventHandlers.invalidActiveValue=Invalid active value to set @@ -2103,14 +2103,14 @@ eventHandlers.invalidInactiveSourceType=Invalid inactive source point data type eventHandlers.invalidInactiveValue=Invalid inactive value to set eventHandlers.invalidScripts=Selecione ao menos um script eventHandlers.maintenanceEvents=Maintenance events -eventHandlers.noEmailRecips=Keine Email Empf\u00e4nger!
Sie m\u00fcssen mindestens einen Email Empf\u00e4nger hinzuf\u00fcgen -eventHandlers.noEscalRecips=Kein Eskalations Email Empf\u00e4nger!
Sie m\u00fcssen mindestens einen Eskalations Email Empf\u00e4nger hinzuf\u00fcgen +eventHandlers.noEmailRecips=Keine Email Empf\u00e4nger! Sie m\u00fcssen mindestens einen Email Empf\u00e4nger hinzuf\u00fcgen +eventHandlers.noEscalRecips=Kein Eskalations Email Empf\u00e4nger! Sie m\u00fcssen mindestens einen Eskalations Email Empf\u00e4nger hinzuf\u00fcgen eventHandlers.noInactiveRecips=You must add inactive recipients eventHandlers.noSetPointAction=No set point action has been defined eventHandlers.noTargetPoint=No target point selected. You may not have any settable points defined. eventHandlers.pointEventDetector=Datenpunktereignisse eventHandlers.publisherEvents=Ereignisse Ver\u00f6ffentlichung -eventHandlers.recipTestEmailMessage=This message was sent as a test of an event handler's email recipient list +eventHandlers.recipTestEmailMessage=This message was sent as a test of an event handler’s email recipient list eventHandlers.recipientType.active=Active eventHandlers.recipientType.escalation=Escalation eventHandlers.recipientType.inactive=Inactive @@ -2266,7 +2266,7 @@ header.scripts=Scripting header.setHomeUrl=setze diese Seite als Lesezeichen header.sql=SQL header.systemSettings=Mango Einstellungen -header.title=Mango, von Serotonin +header.title=Scada-LTS header.toggleMute=Stumm schalten header.unmute=Unmute header.user=Benutzer @@ -2294,7 +2294,7 @@ login.nag=Hinweis: Sie k\u00f6nnten Probleme mit ScadaLTS haben, da dierser Brow login.password=Kennwort login.supportedBrowser=Dieser Browser wird unterst\u00fctzt login.unknownBrowser=Unbekannter Browser -login.unsupportedBrowser=Dieser Browser wird offiziell nicht von Serotonin Software unterst\u00fctzt. Wir empfehlen Firefox, Chrome, oder Internet Explorer 7. +login.unsupportedBrowser=Dieser Browser wird offiziell nicht von Serotonin Software unterst\u00fctzt. Wir empfehlen Mozilla Firefox, Google Chrome. login.userId=Benutzername login.validation.accountDisabled=Ihr Account wurde gesperrt, bitte wenden Sie sich an Ihren Administrator login.validation.invalidLogin=Login gescheitert, bitte versuchen Sie es noch einmal @@ -2412,7 +2412,7 @@ pointDetails.username=Benutzername pointDetails.views=Ansichten pointEdit.buttons.disable=Ausschalten pointEdit.buttons.enable=Einschalten -pointEdit.buttons.note=Hinweis: speichern, deaktivieren oder neu starten setzen alle aktiven Ereignisse zur\u00fcck. +pointEdit.buttons.note=speichern, deaktivieren oder neu starten setzen alle aktiven Ereignisse zur\u00fcck. pointEdit.buttons.restart=Neustart pointEdit.chart.includeSum=Summe berechnen pointEdit.chart.invalidLimit=Tabelle: Anzahl muss zwischen 2 und 50 liegen @@ -2561,7 +2561,7 @@ pointHierarchySLTS.dataSource=Data source pointHierarchySLTS.xid=XID pointHierarchySLTS.type=Type pointHierarchySLTS.changeOfLanguageFailed=Change of language failed -pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don't remove data point in root hierarchy +pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don’t remove data point in root hierarchy pointHierarchySLTS.moveDataPointToRoot=Move the element to root level tree pointHierarchySLTS.movedElement=Moved element @@ -2722,7 +2722,7 @@ reports.pointComments=Point comments reports.pointComments.empty=No point comments to list reports.pointName=Name reports.previous=Vorherige(r) -reports.recipTestEmailMessage=This message was sent as a test of a report's email recipient list +reports.recipTestEmailMessage=This message was sent as a test of a report’s email recipient list reports.relative=Relativ zur Erstellungszeit reports.rendered=Erstellt reports.report=Report @@ -2801,7 +2801,7 @@ sql.query=SQL-Abfrage starten sql.rowsUpdated=Datens\u00e4tze aktualisiert sql.sql=SQL sql.update=SQL-Update ausf\u00fchren -sql.warning=Achtung: Benutzen Sie die SQL Abfragen mit Vorsicht. Benutzerfehler k\u00f6nnen zu Datenverlust und/oder Fehlfunktionen des Systems f\u00fcren.. +sql.warning=Benutzen Sie die SQL Abfragen mit Vorsicht. Benutzerfehler k\u00f6nnen zu Datenverlust und/oder Fehlfunktionen des Systems f\u00fcren. systemSettings.auditAlarmLevels=Audit event alarm levels systemSettings.auditAlarmLevelsSaved=Audit event alarm levels have been saved systemSettings.auth=Server erfordert Legitimation @@ -2824,8 +2824,8 @@ systemSettings.emailSettingsSaved=E-Mail Einstellungen gespeichert systemSettings.eventCount=Gespeicherte Ereignisse systemSettings.filedataSize=Datendateigr\u00f6\u00dfe systemSettings.files=Dateien -systemSettings.fromAddress='Von' Adresse -systemSettings.fromName='Von' Name +systemSettings.fromAddress=’Von’ Adresse +systemSettings.fromName=’Von’ Name systemSettings.futureDateLimit=Discard point values future dated more than systemSettings.groveLogging=Sende Fehler an Serotonin systemSettings.historyCount=Gespeicherte Zeitstempel @@ -2994,7 +2994,7 @@ viewEdit.compound.name=Name viewEdit.compound.width=Breite viewEdit.deletePointView=Delete point component viewEdit.deleteStaticView=Delete static content -viewEdit.deleteView=Remove yourself from the view's share list +viewEdit.deleteView=Remove yourself from the view’s share list viewEdit.editGraphicalRenderer=Bearbeite Darstellung viewEdit.editPointView=Bearbeite Datenpunkt des Bausteins viewEdit.editStaticView=Edit static content @@ -3065,7 +3065,7 @@ viewEdit.viewDelete=L\u00f6schen: viewEdit.viewDeleteConfirm=Confirm viedEdit.viewSize=Gr\u00f6\u00dfe views.newView=Neue Prozessansicht -views.noViews=Sie haben noch kein Prozessbild. Erstellen Sie jetzt eins. +views.noViews=Sie haben noch kein Prozessbild. Erstellen Sie views.title=Prozessbild watchlist.addNewList=Neue Beobachtungsliste watchlist.addToWatchlist=Zur Beobachtungsliste hinzuf\u00fcgen @@ -3336,4 +3336,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor +pointEdit.buttons.note.prefix=Hinweis: +sql.warning.prefix=Achtung: +views.noViews.prefix=jetzt. annotation.api=REST API +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/messages_en.properties b/test/messages_en.properties index e285513a45..db04560d04 100644 --- a/test/messages_en.properties +++ b/test/messages_en.properties @@ -756,7 +756,7 @@ dsEdit.mbus.vifeLabel=Vifes dsEdit.mbus.vifeLabels=Vife labels dsEdit.mbus.vifeTypes=Vife types dsEdit.meta=Meta Data Source -dsEdit.meta.delay=Execution delay
+dsEdit.meta.delay=Execution delay dsEdit.meta.desc=Meta data source properties dsEdit.meta.event=Update event dsEdit.meta.event.context=Context update @@ -1160,8 +1160,8 @@ dsEdit.validate.required=Required value dsEdit.viconics=Viconics Wireless Thermostats dsEdit.viconics.channel=Channel dsEdit.viconics.chipRevision=Chip revision -dsEdit.viconics.chipRevisionBr=Chip
revision -dsEdit.viconics.commAddress=Comm
address +dsEdit.viconics.chipRevisionBr=Chip revision +dsEdit.viconics.commAddress=Comm address dsEdit.viconics.convertCelsius=Convert temperatures to celsius dsEdit.viconics.crss=CRSS dsEdit.viconics.dataSourceNotStarted=Data source is not started @@ -1170,9 +1170,9 @@ dsEdit.viconics.deviceRemove=Device remove (s) dsEdit.viconics.deviceWarning=Device offline timeone (s) dsEdit.viconics.devices=Devices dsEdit.viconics.dpconn=Port: {0}, PAN ID: {1}, Channel: {2} -dsEdit.viconics.firmwareRevision=Firmware
revision +dsEdit.viconics.firmwareRevision=Firmware revision dsEdit.viconics.ieee=IEEE -dsEdit.viconics.modelNumber=Model
number +dsEdit.viconics.modelNumber=Model number dsEdit.viconics.networkIdentifyFailure=Network identify failed: {0} dsEdit.viconics.networkInfo=Network information dsEdit.viconics.networkTimeout=Network offline timeout (s) @@ -1186,9 +1186,9 @@ dsEdit.viconics.timeout=Message timeout dsEdit.viconics.trss=TRSS dsEdit.viconics.unreliable=Point value may not be reliable dsEdit.viconics.zigbeeFirmwareRevision=Zigbee firmware revision -dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee
firmware
revision +dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee firmware revision dsEdit.viconics.zigbeeNetworkAddress=Zigbee network address -dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee
network
address +dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee network address dsEdit.virtual=Virtual Data Source dsEdit.virtual.attractionPoint=Attraction point dsEdit.virtual.change=Change @@ -1254,17 +1254,17 @@ dsedit.opc.tagName=Tag Tag emport.added=added emport.causedBy=caused by: emport.compoundEvent.prefix=Compound event detector ''{0}'': {1} -emport.compoundEvent.xid=A compound event detector does not have an 'xid' value. Ignored. +emport.compoundEvent.xid=A compound event detector does not have an ’xid’ value. Ignored. emport.confirmImport=Warn: the current database will be erased! Are you sure you want to import a new project? emport.data=Data emport.dataPoint.badReference=Data point with XID ''{0}'' does not already exist and references a data source that does not exist. Ignored. emport.dataPoint.prefix=Data point ''{0}'': {1} -emport.dataPoint.xid=A data point with name ''{0}'' does not have an 'xid' value. Ignored. +emport.dataPoint.xid=A data point with name ''{0}'' does not have an ’xid’ value. Ignored. emport.dataPoints=Data points -emport.dataSource.invalidType=Data source with XID ''{0}'' does not already exist and has an invalid 'type' value of ''{1}''. Valid types are {2} -emport.dataSource.missingType=Data source with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} +emport.dataSource.invalidType=Data source with XID ''{0}'' does not already exist and has an invalid ’type’ value of ''{1}''. Valid types are {2} +emport.dataSource.missingType=Data source with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} emport.dataSource.prefix=Data source ''{0}'': {1} -emport.dataSource.xid=A data source with name ''{0}'' does not have an 'xid' value. Ignored. +emport.dataSource.xid=A data source with name ''{0}'' does not have an ’xid’ value. Ignored. emport.error.alarmLevel=Invalid alarm level ''{0}'' for event ''{1}''. Valid values are {2} emport.error.attractor.missingPoint=Data point with ''{0}'' XID ''{1}'' not found emport.error.chart.invalid=Chart renderer has an invalid ''{0}'' value of ''{1}''. Valid values are {2} @@ -1272,7 +1272,7 @@ emport.error.chart.missing=Chart renderer must have a ''{0}''. Valid values are emport.error.component.imageChart.invalid=Image chart component has an invalid ''{0}'' value of ''{1}''. Valid values are {2} emport.error.component.imageChart.missing=Image chart component must have a ''{0}''. Valid values are {1} emport.error.component.imageIndex=Image index {0} is too high for image set ''{1}''. Valid values are 0 to {2} -emport.error.component.incompatibleDataType=Data point with 'XID' ''{0}'' has a data type that is not compatible with view component type ''{1}'' +emport.error.component.incompatibleDataType=Data point with ’XID’ ''{0}'' has a data type that is not compatible with view component type ''{1}'' emport.error.component.invalid=View component has an invalid ''{0}'' value of ''{1}''. Valid values are {2} emport.error.component.missing=View component must have a ''{0}''. Valid values are {1} emport.error.component.unknownDynamicImage=Dynamic image id ''{0}'' not found. Known dynamic image ids are {1} @@ -1311,7 +1311,7 @@ emport.error.text.missing=Text renderer must have a ''{0}''. Valid values are {1 emport.error.viewShare.missing=Missing ''{0}'' in view share emport.errorMessage=Errors: emport.eventHandler.prefix=Point link ''{0}'': {1} -emport.eventHandler.xid=A point link does not have an 'xid' value. Ignored. +emport.eventHandler.xid=A point link does not have an ’xid’ value. Ignored. emport.export=Export emport.exportDate=Export date emport.exportJson=Generate JSON @@ -1334,29 +1334,29 @@ emport.importProjectTitle=Import Project (Upload) emport.includePointValues=Include point values emport.indent=Indent level emport.invalidFile=File reading failed ({0}) -emport.invalidImportData=Import data is invalid: not a JSON object +emport.invalidImportData=Import data is invalid: not a JSON object. (www.json.org) emport.invalidProjectName=Invalid name emport.mailingList.prefix=Mailing list ''{0}'': {1} -emport.mailingList.xid=A mailing list does not have an 'xid' value. Ignored. +emport.mailingList.xid=A mailing list does not have an ’xid’ value. Ignored. emport.maintenanceEvent.prefix=Maintenance event ''{0}'': {1} -emport.maintenanceEvent.xid=A maintenance event does not have an 'xid' value. Ignored. +emport.maintenanceEvent.xid=A maintenance event does not have an ’xid’ value. Ignored. emport.noMessages=No result message. Nothing to import? emport.parseError=JSON parse error: {0} emport.pointHierarchy.prefix=Point hierarchy: {0} emport.pointLink.prefix=Point link ''{0}'': {1} -emport.pointLink.xid=A point link does not have an 'xid' value. Ignored. +emport.pointLink.xid=A point link does not have an ’xid’ value. Ignored. emport.pointValue.missingPoint=Point value ''{0}'': Data point not found emport.pointValues=Point values emport.pointValuesMax= Max point values emport.projectDescription=Description emport.projectName=Project name -emport.publisher.invalidType=Publisher with XID ''{0}'' does not already exist and has an invalid 'type' value of ''{1}''. Valid types are {2} -emport.publisher.missingType=Publisher with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} +emport.publisher.invalidType=Publisher with XID ''{0}'' does not already exist and has an invalid ’type’ value of ''{1}''. Valid types are {2} +emport.publisher.missingType=Publisher with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} emport.publisher.prefix=Publisher ''{0}'': {1} -emport.publisher.xid=A data source with name ''{0}'' does not have an 'xid' value. Ignored. +emport.publisher.xid=A data source with name ''{0}'' does not have an ’xid’ value. Ignored. emport.saved=saved emport.scheduledEvent.prefix=Scheduled event ''{0}'': {1} -emport.scheduledEvent.xid=A scheduled event does not have an 'xid' value. Ignored. +emport.scheduledEvent.xid=A scheduled event does not have an ’xid’ value. Ignored. emport.script.prefix=Script ''{0}'': {1} emport.select=Select what you would like to export emport.selectAll=Select all @@ -1367,14 +1367,14 @@ emport.unselectAll=Unselect all emport.uploadError=Upload failed ({0}) emport.uploadsFolder=Include Uploads folder emport.user.prefix=User ''{0}'': {1} -emport.user.username=A user does not have a 'username' value. Ignored. +emport.user.username=A user does not have a ’username’ value. Ignored. emport.userPermission.prefix=Permissions for user ''{0}'': {1} -emport.versionError=The project version ({0}) isn't compatible with current system version ({1}) -emport.view.missingType=View with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} +emport.versionError=The project version ({0}) isn’t compatible with current system version ({1}) +emport.view.missingType=View with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} emport.view.prefix=View ''{0}'': {1} -emport.view.xid=A graphical view does not have an 'xid' value. Ignored. +emport.view.xid=A graphical view does not have an ’xid’ value. Ignored. emport.watchList.prefix=Watch list ''{0}'': {1} -emport.watchList.xid=A watch list does not have an 'xid' value. Ignored. +emport.watchList.xid=A watch list does not have an ’xid’ value. Ignored. engUnit.0=square meters engUnit.1=square feet engUnit.10=megavolt amperes @@ -1567,8 +1567,8 @@ engUnit.98=percent engUnit.99=percent per second engUnit.190=kilometers engUnit.abbr.190=km -engUnit.abbr.0=m2 -engUnit.abbr.1=f2 +engUnit.abbr.0=m\u00b2 +engUnit.abbr.1=ft\u00b2 engUnit.abbr.10=megavolt amperes engUnit.abbr.100=per minute engUnit.abbr.101=per second @@ -1789,7 +1789,7 @@ event.alarmMaxDecreased=Maximum alarm level has decreased from {0} to {1} event.alarmMaxIncreased=Maximum alarm level has increased from {0} to {1} event.audit.added=User "{0}" created {1} with id {2}: {3} event.audit.changed=User "{0}" changed {1} with id {2}: {3} -event.audit.changedProperty=
    {0}: "{1}" to "{2}" +event.audit.changedProperty= {0}: "{1}" to "{2}", event.audit.compoundEventDetector=Compound event detector event.audit.dataPoint=Data point event.audit.dataSource=Data source @@ -1798,7 +1798,7 @@ event.audit.eventHandler=Event handler event.audit.maintenanceEvent=Maintenance event event.audit.pointEventDetector=Point event detector event.audit.pointLink=Point link -event.audit.property=
    {0}="{1}" +event.audit.property= {0}="{1}", event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2053,8 +2053,8 @@ event.valueParse.generalParsePoint={0}, result={1}, point={2} event.valueParse.noData=No data to match against for point {0} event.valueParse.noTime=No time match made {0} event.valueParse.noValue=No value match made for point {0} -event.valueParse.numericParse=Couldn't parse to numeric, result={0} -event.valueParse.numericParsePoint=Couldn't parse to numeric, result={0}, point={1} +event.valueParse.numericParse=Couldn’t parse to numeric, result={0} +event.valueParse.numericParsePoint=Couldn’t parse to numeric, result={0}, point={1} event.valueParse.textParse=Value did not match any multistate text and was not parsable, result={0} event.valueParse.textParsePoint=Value did not match any multistate text and was not parsable, result={0}, point={1} event.valueParse.timeParse=Failed to parse time "{0}" @@ -2084,7 +2084,7 @@ eventHandlers.escal=Send escalation eventHandlers.escalDelayError=Escalation delay must be greater than zero eventHandlers.escalPeriod=Escalate if active for eventHandlers.escalRecipients=Escalation recipients -eventHandlers.escalTestEmailMessage=This message was sent as a test of an event handler's escalation list +eventHandlers.escalTestEmailMessage=This message was sent as a test of an event handler’s escalation list eventHandlers.eventHandler=Event handler eventHandlers.eventHandlers=Event handlers eventHandlers.inactiveAction=Inactive action @@ -2093,7 +2093,7 @@ eventHandlers.inactiveNotif=Send inactive notification eventHandlers.inactiveOverride=Override inactive recipients eventHandlers.inactiveRecipients=Inactive recipients eventHandlers.inactiveScript=When inactive script -eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler's inactive list +eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler’s inactive list eventHandlers.invalidActiveSource=Invalid active source point eventHandlers.invalidActiveSourceType=Invalid active source point data type eventHandlers.invalidActiveValue=Invalid active value to set @@ -2110,7 +2110,7 @@ eventHandlers.noSetPointAction=No set point action has been defined eventHandlers.noTargetPoint=No target point selected. You may not have any settable points defined. eventHandlers.pointEventDetector=Point event detectors eventHandlers.publisherEvents=Publisher events -eventHandlers.recipTestEmailMessage=This message was sent as a test of an event handler's email recipient list +eventHandlers.recipTestEmailMessage=This message was sent as a test of an event handler’s email recipient list eventHandlers.recipientType.active=Active eventHandlers.recipientType.escalation=Escalation eventHandlers.recipientType.inactive=Inactive @@ -2295,7 +2295,7 @@ login.nag=NOTE: you may have problems with ScadaLTS because your browser is not login.password=Password login.supportedBrowser=This browser is supported. login.unknownBrowser=Checking your browser for compatibility... -login.unsupportedBrowser=Your browser may work with this product, but is not officially supported by Serotonin Software. We instead recommend the use of Firefox, Chrome, or Internet Explorer 7 +login.unsupportedBrowser=Your browser may work with this product, but is not officially supported by Serotonin Software. We instead recommend the use of Mozilla Firefox, Google Chrome. login.userId=User id login.validation.accountDisabled=Your account has been disabled. Please contact your administrator login.validation.invalidLogin=Invalid login, please try again @@ -2368,7 +2368,7 @@ notes.timeByUsername=time by username notes.userNotes=User notes notification.newui.title=New page is available! notification.newui.move=Move! -notification.newui.dontshow=Don't show again. +notification.newui.dontshow=Don’t show again. pagination.ascending=Ascending pagination.descending=Descending pagination.next=Next @@ -2413,7 +2413,7 @@ pointDetails.username=Username pointDetails.views=Views pointEdit.buttons.disable=Disable pointEdit.buttons.enable=Enable -pointEdit.buttons.note=Note: saving, disabling, or restarting a point causes all active events to be returned to normal. +pointEdit.buttons.note=saving, disabling, or restarting a point causes all active events to be returned to normal. pointEdit.buttons.restart=Restart pointEdit.chart.includeSum=Include sum pointEdit.chart.invalidLimit=Chart renderer: limit must be between 2 and 50 @@ -2561,7 +2561,7 @@ pointHierarchySLTS.dataSource=Data source pointHierarchySLTS.xid=XID pointHierarchySLTS.type=Type pointHierarchySLTS.changeOfLanguageFailed=Change of language failed -pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don't remove data point in root hierarchy +pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don’t remove data point in root hierarchy pointHierarchySLTS.moveDataPointToRoot=Move the element to root level tree pointHierarchySLTS.areYouSureToMoveElement=Are you sure to move element? pointHierarchySLTS.movedElement=Moved element @@ -2725,7 +2725,7 @@ reports.pointComments=Point comments reports.pointComments.empty=No point comments to list reports.pointName=Point name reports.previous=Previous -reports.recipTestEmailMessage=This message was sent as a test of a report's email recipient list +reports.recipTestEmailMessage=This message was sent as a test of a report’s email recipient list reports.relative=Relative to report time reports.rendered=Rendered reports.report=Report @@ -2804,7 +2804,7 @@ sql.query=Submit query sql.rowsUpdated=records(s) updated. sql.sql=SQL sql.update=Submit update -sql.warning=Warning: use this facility at your own risk. Incorrect usage may result in corrupted data and/or system failures. +sql.warning=use this facility at your own risk. Incorrect usage may result in corrupted data and/or system failures. systemSettings.auditAlarmLevels=Audit event alarm levels systemSettings.auditAlarmLevelsSaved=Audit event alarm levels have been saved systemSettings.auth=Use authorization @@ -2827,8 +2827,8 @@ systemSettings.emailSettingsSaved=Email settings have been saved systemSettings.eventCount=Event count systemSettings.filedataSize=Filedata size systemSettings.files=files -systemSettings.fromAddress='From' address -systemSettings.fromName='From' name +systemSettings.fromAddress=’From’ address +systemSettings.fromName=’From’ name systemSettings.futureDateLimit=Discard point values future dated more than systemSettings.groveLogging=Send errors to Serotonin systemSettings.historyCount=History count @@ -3001,7 +3001,7 @@ viewEdit.compound.name=Name viewEdit.compound.width=Width viewEdit.deletePointView=Delete point component viewEdit.deleteStaticView=Delete static content -viewEdit.deleteView=Remove yourself from the view's share list +viewEdit.deleteView=Remove yourself from the view’s share list viewEdit.editGraphicalRenderer=Edit graphical renderer viewEdit.editPointView=Edit point component settings viewEdit.editStaticView=Edit static content @@ -3072,7 +3072,7 @@ viewEdit.viewDelete=Delete view: viewEdit.viewDeleteConfirm=Confirm viedEdit.viewSize=Size views.newView=New view -views.noViews=You have not created any graphical views. Create one now. +views.noViews=You have not created any graphical views. Create one views.title=Graphic views watchlist.addNewList=Add new watch list watchlist.addToWatchlist=Add to watch list @@ -3089,7 +3089,7 @@ watchlist.imageChartButton=Get Chart watchlist.imageChartLiveButton=Start/Stop Live Chart watchlist.moveDown=Move down watchlist.moveUp=Move up -watchlist.newListName=Enter the watch list's new name +watchlist.newListName=Enter the watch list’s new name watchlist.noChartables=No chartable points in watch list watchlist.noExportables=No points selected for export watchlist.pointDetails=Point details @@ -3339,4 +3339,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor +pointEdit.buttons.note.prefix=Note: +sql.warning.prefix=Warning: +views.noViews.prefix=now. annotation.api=REST API +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/messages_es.properties b/test/messages_es.properties index d741dcc304..2ca2afdf82 100644 --- a/test/messages_es.properties +++ b/test/messages_es.properties @@ -13,7 +13,7 @@ # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# along with this program. If not, see . # # This file incorporates work covered by the following copyright and # permission notice: @@ -780,7 +780,7 @@ dsEdit.mbus.vifeTypes=Tipos de Vife dsEdit.mbus.vifLabel=Etiqueta Vif dsEdit.mbus.vifType=Tipo de Vif dsEdit.meta=Fuente de datos Meta -dsEdit.meta.delay=Demorar la Ejecuci\u00f3n
+dsEdit.meta.delay=Demorar la Ejecuci\u00f3n dsEdit.meta.desc=Propiedades de fuente de datos Meta dsEdit.meta.event=Actualizar evento dsEdit.meta.event.context=Actualizar contexto @@ -1145,8 +1145,8 @@ dsEdit.validate.required=Valor requerido dsEdit.viconics=Termostato inal\u00e1mbrico Viconics dsEdit.viconics.channel=Canal dsEdit.viconics.chipRevision=Revisi\u00f3n de Chip -dsEdit.viconics.chipRevisionBr=Chip
revisi\u00f3n -dsEdit.viconics.commAddress=Comm
direcci\u00f3n +dsEdit.viconics.chipRevisionBr=Chip revisi\u00f3n +dsEdit.viconics.commAddress=Comm direcci\u00f3n dsEdit.viconics.convertCelsius=Conversi\u00f3n de temperatura a Celsius dsEdit.viconics.crss=CRSS dsEdit.viconics.dataSourceNotStarted=Fuente de datos no ha sido iniciada @@ -1155,9 +1155,9 @@ dsEdit.viconics.deviceRemove=Eliminaci\u00f3n de dispositivo (s) dsEdit.viconics.devices=Dispositivos dsEdit.viconics.deviceWarning=Desconexi\u00f3n de Dispositivo por tiempo de espera (s) dsEdit.viconics.dpconn=Puerto: {0}, ID PAN: {1}, Canal: {2} -dsEdit.viconics.firmwareRevision=Firmware
revisi\u00f3n +dsEdit.viconics.firmwareRevision=Firmware revisi\u00f3n dsEdit.viconics.ieee=IEEE -dsEdit.viconics.modelNumber=Modelo
n\u00famero +dsEdit.viconics.modelNumber=Modelo n\u00famero dsEdit.viconics.networkIdentifyFailure=Fall\u00f3 identificaci\u00f3n de Red: {0} dsEdit.viconics.networkInfo=Informaci\u00f3n de la Red dsEdit.viconics.networkTimeout=Desconexi\u00f3n de Red por tiempo de espera (s) @@ -1171,9 +1171,9 @@ dsEdit.viconics.timeout=Tiempo de espera del mensaje dsEdit.viconics.trss=TRSS dsEdit.viconics.unreliable=El valor del Punto puede no ser confiable dsEdit.viconics.zigbeeFirmwareRevision=Revisi\u00f3n de Firmware de Zigbee -dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee
firmware
revision +dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee firmware revision dsEdit.viconics.zigbeeNetworkAddress=Direcci\u00f3n de red de Zigbee -dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee
network
address +dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee network address dsEdit.virtual=Fuente de datos Virtual dsEdit.virtual.attractionPoint=Punto de atracci\u00f3n dsEdit.virtual.change=Cambio @@ -1237,17 +1237,17 @@ dsList.type=Tipo emport.added=agregado emport.causedBy=causado por: emport.compoundEvent.prefix=Detector de evento compuesto ''{0}'': {1} -emport.compoundEvent.xid=Un detector de evento compuesto no tiene un valor 'xid'. Ignorado. +emport.compoundEvent.xid=Un detector de evento compuesto no tiene un valor ’xid’. Ignorado. emport.confirmImport=Atenci\u00f3n: todos los datos del proyecto actual ser\u00e1n eliminados! \u00bfEst\u00e1 seguro que desea importar un nuevo proyecto? emport.data=Dato emport.dataPoint.badReference=Dato del punto con XID ''{0}'' ya no existe y hace referencia a una fuente de datos que no existe. Ignorado emport.dataPoint.prefix=Dato del punto''{0}'': {1} -emport.dataPoint.xid=A Dato del punto con Nombre ''{0}'' no tiene un valor 'xid'. Ignorado. +emport.dataPoint.xid=A Dato del punto con Nombre ''{0}'' no tiene un valor ’xid’. Ignorado. emport.dataPoints=Datos de puntos -emport.dataSource.invalidType= La fuente de datos con XID ''{0}'' ya no existe y tiene un valor de 'tipo' inv\u00e1lido de ''{1}''. Los tipos v\u00e1lidos son {2} +emport.dataSource.invalidType= La fuente de datos con XID ''{0}'' ya no existe y tiene un valor de ’tipo’ inv\u00e1lido de ''{1}''. Los tipos v\u00e1lidos son {2} emport.dataSource.missingType=La fuente de datos con XID ''{0}'' ya no existe y no tiene un valor de "tipo". Los tipos v\u00e1lidos son {1} emport.dataSource.prefix=Fuente de datos ''{0}'': {1} -emport.dataSource.xid=LA fuente de datos de Nombre ''{0}'' no tienen un valor 'xid'. Ignorado. +emport.dataSource.xid=LA fuente de datos de Nombre ''{0}'' no tienen un valor ’xid’. Ignorado. emport.error.alarmLevel=Nivel de alarma inv\u00e1lido ''{0}'' para el evento ''{1}''. Los valores v\u00e1lidos son {2} emport.error.attractor.missingPoint=Dato del punto con ''{0}'' XID ''{1}'' no encontrado emport.error.chart.invalid=El generador gr\u00e1fico tiene un valor inv\u00e1lido de ''{0}'' de ''{1}''. Los valores v\u00e1lidos son {2} @@ -1255,7 +1255,7 @@ emport.error.chart.missing=El generador gr\u00e1fico deber\u00eda tener un ''{0} emport.error.component.imageChart.invalid=El componente del Gr\u00e1fico tiene un valor inv\u00e1lido ''{0}'' de ''{1}''. Los valores v\u00e1lidos son {2} emport.error.component.imageChart.missing=El componente del Gr\u00e1fico deber\u00eda tener un ''{0}''. Los valores v\u00e1lidos son {1} emport.error.component.imageIndex=El \u00edndice de la imagen {0} es muy grande para su conjunto ''{1}''. Los valores v\u00e1lidos son 0 to {2} -emport.error.component.incompatibleDataType=Dato del punto con 'XID' ''{0}'' tiene un tipo de dato que no es compatible con el componente de la Vista de tipo ''{1}'' +emport.error.component.incompatibleDataType=Dato del punto con ’XID’ ''{0}'' tiene un tipo de dato que no es compatible con el componente de la Vista de tipo ''{1}'' emport.error.component.invalid=El componente de la Vista tiene un valor inv\u00e1lido ''{0}'' de ''{1}''. Los valores v\u00e1lidos son {2} emport.error.component.missing=El componente de la Vista deber\u00eda tener un ''{0}''. Los valores v\u00e1lidos son {1} emport.error.component.unknownDynamicImage=ID de Imagen din\u00e1mica ''{0}'' no encontrada. Las im\u00e1genes din\u00e1micas conocidas son {1} @@ -1289,12 +1289,12 @@ emport.error.recipient.invalid.reference=Recipient tiene un valor inv\u00e1lido emport.error.recipient.missing=Recipient deber\u00eda tener un ''{0}''. Los valores v\u00e1lidos son {1} emport.error.recipient.missing.reference=Recipient deber\u00eda tener un ''{0}'' emport.error.scheduledEvent.invalid=El planificador de eventos tiene un valor inv\u00e1lido ''{0}'' de ''{1}''. Los valores v\u00e1lidos son {2} -emport.error.text.invalid=El generador de texto tiene un valor inv\u00e1lido de ''{0}''de ''{1}''. Los valores v\u00e1lidos son {2} +emport.error.text.invalid=El generador de texto tiene un valor inv\u00e1lido de ''{0}'' de ''{1}''. Los valores v\u00e1lidos son {2} emport.error.text.missing=El generador de texto deber\u00eda tener un ''{0}''. Los valores v\u00e1lidos son {1} emport.error.viewShare.missing=Perdido ''{0}'' en la vista compartida emport.errorMessage=Hay errores en el archivo enviado: emport.eventHandler.prefix=Enlace a punto ''{0}'': {1} -emport.eventHandler.xid=Un enlace a punto no tiene un valor 'xid'. Ignorado. +emport.eventHandler.xid=Un enlace a punto no tiene un valor ’xid’. Ignorado. emport.export=Exportar emport.exportDate=Fecha de exportaci\u00f3n emport.exportJson=Generar JSON @@ -1317,29 +1317,29 @@ emport.importProjectTitle=Importar Proyecto (Upload) emport.includePointValues=Incluir hist\u00f3rico de puntos emport.indent=Nivel de identaci\u00f3n emport.invalidFile=Error en la lectura del archivo ({0}) -emport.invalidImportData=Dato de importaci\u00f3n inv\u00e1lido: no es un objeto JSON +emport.invalidImportData=Dato de importaci\u00f3n inv\u00e1lido: no es un objeto JSON. (www.json.org) emport.invalidProjectName=Nombre inv\u00e1lido para el Proyecto emport.mailingList.prefix=Prefijo de la lista de correo -emport.mailingList.xid=Una lista de correo no tiene un valor 'xid'. Ignorado. +emport.mailingList.xid=Una lista de correo no tiene un valor ’xid’. Ignorado. emport.maintenanceEvent.prefix=Evento de mantenimiento ''{0}'': {1} -emport.maintenanceEvent.xid=Un evento de mantenimiento no tienen valor 'xid'. Se ignor\u00f3. +emport.maintenanceEvent.xid=Un evento de mantenimiento no tienen valor ’xid’. Se ignor\u00f3. emport.noMessages=Sin mensaje de resultado. \u00bfNada que importar? emport.parseError=Error de an\u00e1lisis JSON: {0} emport.pointHierarchy.prefix=Jerarqu\u00eda de Punto: {0} emport.pointLink.prefix=Punto de enlace ''{0}'': {1} -emport.pointLink.xid=Un punto de enlace no tiene un valor 'xid'. Ignorado. +emport.pointLink.xid=Un punto de enlace no tiene un valor ’xid’. Ignorado. emport.pointValue.missingPoint=Hist\u00f3rico de punto ''{0}'': Informaci\u00f3n del punto no se encuentra emport.pointValues=Hist\u00f3rico (valores) emport.pointValuesMax=M\u00e1ximo (puntos a guardar) emport.projectDescription=Descripci\u00f3n emport.projectName=Nombre del Proyecto -emport.publisher.invalidType=Publisher with XID ''{0}'' ya no existe y tiene un inv\u00e1lido 'type' valor de ''{1}''. Los tipos v\u00e1lidos son {2} -emport.publisher.missingType=Publicador con XID ''{0}'' ya no existe y no tiene un valor de 'type'. Los tipos v\u00e1lidos son {1} +emport.publisher.invalidType=Publisher with XID ''{0}'' ya no existe y tiene un inv\u00e1lido ’type’ valor de ''{1}''. Los tipos v\u00e1lidos son {2} +emport.publisher.missingType=Publicador con XID ''{0}'' ya no existe y no tiene un valor de ’type’. Los tipos v\u00e1lidos son {1} emport.publisher.prefix=Publicador ''{0}'': {1} -emport.publisher.xid=La fuente de datos con el nombre ''{0}'' no tiene un valor 'xid'. Ignorado. +emport.publisher.xid=La fuente de datos con el nombre ''{0}'' no tiene un valor ’xid’. Ignorado. emport.saved=guardado emport.scheduledEvent.prefix=El planificador de eventos ''{0}'': {1} -emport.scheduledEvent.xid=A El planificador de eventos no tiene un valor 'xid'. Ignorado. +emport.scheduledEvent.xid=A El planificador de eventos no tiene un valor ’xid’. Ignorado. emport.script.prefix=Script ''{0}'': {1} emport.select=Seleccione que le gustar\u00eda exportar emport.selectAll=Seleccione todo @@ -1350,14 +1350,14 @@ emport.unselectAll=Desmarcar todo emport.uploadError=Fall\u00f3 carga (upload) de archivo ({0}) emport.uploadsFolder=Incluir carpeta de Uploads emport.user.prefix=Usuario ''{0}'': {1} -emport.user.username=Un usuario no tiene un valor de 'nombre de usuario'. Ignorado +emport.user.username=Un usuario no tiene un valor de ’nombre de usuario’. Ignorado emport.userPermission.prefix=Permisos para el usuario ''{0}'': {1} emport.versionError=La versi\u00f3n del proyecto ({0}) es incompatible con la versi\u00f3n actual del sistema ({1}) emport.view.missingType=Vista con XID ''{0}'' ya no existe y no tiene un valor de "tipo". Los tipos v\u00e1lidos son {1} emport.view.prefix=Vista ''{0}'': {1} -emport.view.xid=Una vista gr\u00e1fica no tiene un valor 'xid'. Ignorado. +emport.view.xid=Una vista gr\u00e1fica no tiene un valor ’xid’. Ignorado. emport.watchList.prefix=Lista de Supervisi\u00f3n ''{0}'': {1} -emport.watchList.xid=Una Lista de Supervisi\u00f3n no tiene un valor de 'xid'. Se ignora. +emport.watchList.xid=Una Lista de Supervisi\u00f3n no tiene un valor de ’xid’. Se ignora. engUnit.0=metros cuadrados engUnit.1=pies cuadrados engUnit.10=megavoltio amperios @@ -1550,8 +1550,8 @@ engUnit.98=porcentaje engUnit.99=porcentaje por segundo engUnit.190=kilómetros engUnit.abbr.190=km -engUnit.abbr.0=m2 -engUnit.abbr.1=f2 +engUnit.abbr.0=m\u00b2 +engUnit.abbr.1=ft\u00b2 engUnit.abbr.10=megavoltio amperios engUnit.abbr.100=por minuto engUnit.abbr.101=por segundo @@ -1777,7 +1777,7 @@ event.alarmMaxDecreased=Nivel m\u00e1ximo de la alarma ha sido disminuido de {0} event.alarmMaxIncreased=Nivel m\u00e1ximo de la alarma ha sido incrementado de {0} a {1} event.audit.added=Usuario "{0}" creado {1} con id {2}: {3} event.audit.changed=Usuario "{0}" modificado {1} con id {2}: {3} -event.audit.changedProperty=
    {0}: "{1}" a "{2}" +event.audit.changedProperty={0}: "{1}" a "{2}" event.audit.compoundEventDetector=Detector de evento compuesto event.audit.dataPoint=Datos de punto event.audit.dataSource=Fuente de Datos @@ -1786,7 +1786,7 @@ event.audit.eventHandler=Manejador de evento event.audit.maintenanceEvent=Evento de Mantenimiento event.audit.pointEventDetector=Detector de evento de punto event.audit.pointLink=Enlace de Punto -event.audit.property=
    {0} +event.audit.property={0} event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2278,7 +2278,7 @@ login.nag=NOTA: Puede tener problemas con ScadaLTS porque su navegador no est\u0 login.password=Contrase\u00f1a login.supportedBrowser=Este navegador est\u00e1 soportado. login.unknownBrowser=Revisando compatibilidad del navegador... -login.unsupportedBrowser=Su navegador puede trabajar con este producto, pero no est\u00e1 oficialmente soportado por Serotonin Software. Le recomendamos que tilice Firefox, Chrome, o Internet Explorer 7. +login.unsupportedBrowser=Su navegador puede trabajar con este producto, pero no est\u00e1 oficialmente soportado por Serotonin Software. Le recomendamos que tilice Mozilla Firefox, Google Chrome. login.userId=ID de Usuario login.validation.accountDisabled=Su cuenta ha sido deshabilitada. Por favor contacte al administrador login.validation.invalidLogin=Inicio de sesi\u00f3n Inv\u00e1lido, por favor intente de nuevo. @@ -2351,7 +2351,7 @@ notes.timeByUsername=Hora del usuario notes.userNotes=Notas de Usuario notification.newui.title=New page is available! notification.newui.move=Move! -notification.newui.dontshow=Don't show again. +notification.newui.dontshow=Don’t show again. pagination.ascending=Incrementando pagination.descending=Disminuyendo pagination.next=Pr\u00f3ximo @@ -2396,7 +2396,7 @@ pointDetails.username=Nombre de Usuario pointDetails.views=Vistas pointEdit.buttons.disable=Deshabilitar pointEdit.buttons.enable=Habilitar -pointEdit.buttons.note=nueva. +views.noViews=No se ha creado ninguna vista gr\u00e1fica. Cree una views.title=Vistas gr\u00e1ficas watchlist.addNewList=Agregar nueva Lista de Supervisi\u00f3n watchlist.addToWatchlist=Agregar a Lista de Supervisi\u00f3n @@ -3295,7 +3295,7 @@ graphic.enhancedImageChart.seriesConfig.seriesOptions=Options for {0}\: dsEdit.modbus.dpconn3=Connection monitoring viewEdit.compound.point.lineType.spline=Spline userProfiles.validate.nameUnique=Profile name must be unique and not empty -eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler's inactive list +eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler’s inactive list graphic.enhancedImageChart.pointConfig.renderMode.line=Line watchlist.imageChartLiveButton=Start/Stop Live Chart dsEdit.radiuino.radiuinoDataType.4bFloat=Float (4 bytes) @@ -3379,4 +3379,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor +pointEdit.buttons.note.prefix=Nota: +sql.warning.prefix=Advertencia: +views.noViews.prefix=nueva. annotation.api=REST API +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/messages_fi.properties b/test/messages_fi.properties index 59d81b0451..68419a159b 100644 --- a/test/messages_fi.properties +++ b/test/messages_fi.properties @@ -667,7 +667,7 @@ dsEdit.meta.event.week=Viikon alku dsEdit.meta.event.month=Kuukauden alku dsEdit.meta.event.year=Vuoden alku dsEdit.meta.event.cron=Cron-ajastus -dsEdit.meta.delay=Suoritusviive
+dsEdit.meta.delay=Suoritusviive dsEdit.meta.test.success=Onnistui. tulos={0} dsEdit.meta.test.successTs=Onnistui. tulos={0}, aikaleima={1} dsEdit.meta.test.context=Yksi tai useampi piste puuttuu tai ei ole k\u00e4yt\u00f6ss\u00e4 @@ -966,16 +966,16 @@ dsEdit.viconics.networkInfo=Network information dsEdit.viconics.refreshing=Refreshing... dsEdit.viconics.rfModule=RF Module dsEdit.viconics.devices=Devices -dsEdit.viconics.commAddress=Comm
address -dsEdit.viconics.modelNumber=Model
number -dsEdit.viconics.firmwareRevision=Firmware
revision +dsEdit.viconics.commAddress=Comm address +dsEdit.viconics.modelNumber=Model number +dsEdit.viconics.firmwareRevision=Firmware revision dsEdit.viconics.zigbeeFirmwareRevision=Zigbee firmware revision -dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee
firmware
revision +dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee firmware revision dsEdit.viconics.zigbeeNetworkAddress=Zigbee network address -dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee
network
address +dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee network address dsEdit.viconics.ieee=IEEE dsEdit.viconics.chipRevision=Chip revision -dsEdit.viconics.chipRevisionBr=Chip
revision +dsEdit.viconics.chipRevisionBr=Chip revision dsEdit.viconics.trss=TRSS dsEdit.viconics.crss=CRSS dsEdit.viconics.unreliable=Point value may not be reliable @@ -1096,42 +1096,42 @@ emport.importProgress=Tuonti k\u00e4ynniss\u00e4... emport.importCancelled=Tuonti peruttu emport.importComplete=Tuonti valmis emport.noMessages=Ei tulosviesti\u00e4. Ei mit\u00e4\u00e4n tuotavaa? -emport.invalidImportData=Tuotava tieto on virheellinen: Ei JSON-objekti +emport.invalidImportData=Tuotava tieto on virheellinen: Ei JSON-objekti. (www.json.org) emport.parseError=JSON j\u00e4sennysvirhe: {0} -emport.user.username=K\u00e4ytt\u00e4j\u00e4ll\u00e4 ei ole 'username'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.user.username=K\u00e4ytt\u00e4j\u00e4ll\u00e4 ei ole ’username’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.user.prefix=K\u00e4ytt\u00e4j\u00e4 ''{0}'': {1} -emport.view.missingType=N\u00e4ytt\u00f6 XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa eik\u00e4 sill\u00e4 ole 'type'-arvoa. Sallitut arvot ovat {1} -emport.dataSource.xid=Datal\u00e4hde nimell\u00e4 ''{0}'', ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. -emport.dataSource.missingType=Datal\u00e4hde XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa eik\u00e4 sill\u00e4 ole 'type'-arvoa. Sallitut arvot ovat {1} -emport.dataSource.invalidType=Datal\u00e4hde XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa ja sill\u00e4 on virheellinen 'type'-arvo: ''{1}''. Sallitut arvot ovat {2} +emport.view.missingType=N\u00e4ytt\u00f6 XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa eik\u00e4 sill\u00e4 ole ’type’-arvoa. Sallitut arvot ovat {1} +emport.dataSource.xid=Datal\u00e4hde nimell\u00e4 ''{0}'', ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.dataSource.missingType=Datal\u00e4hde XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa eik\u00e4 sill\u00e4 ole ’type’-arvoa. Sallitut arvot ovat {1} +emport.dataSource.invalidType=Datal\u00e4hde XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa ja sill\u00e4 on virheellinen ’type’-arvo: ''{1}''. Sallitut arvot ovat {2} emport.dataSource.prefix=Datal\u00e4hde ''{0}'': {1} -emport.dataPoint.xid=Piste nimell\u00e4 ''{0}'' ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.dataPoint.xid=Piste nimell\u00e4 ''{0}'' ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.dataPoint.badReference=Piste XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa ja viittaa datal\u00e4hteeseen jota ei ole olemassa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.dataPoint.prefix=Piste ''{0}'': {1} emport.userPermission.prefix=Oikeudet k\u00e4ytt\u00e4j\u00e4lle ''{0}'': {1} emport.added=lis\u00e4tty emport.saved=tallennettu emport.causedBy=aiheuttaja: -emport.view.xid=N\u00e4yt\u00f6ll\u00e4 ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.view.xid=N\u00e4yt\u00f6ll\u00e4 ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.view.prefix=N\u00e4ytt\u00f6 ''{0}'': {1} emport.pointHierarchy.prefix=Pistehierarkia: {0} -emport.pointLink.xid=Pistelinkill\u00e4 ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.pointLink.xid=Pistelinkill\u00e4 ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.pointLink.prefix=Pistelinkki ''{0}'': {1} -emport.scheduledEvent.xid=Ajastetulla tapahtumalla ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.scheduledEvent.xid=Ajastetulla tapahtumalla ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.scheduledEvent.prefix=Ajastettu tapahtuma ''{0}'': {1} -emport.compoundEvent.xid=Yhdistelm\u00e4tapahtumalla ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.compoundEvent.xid=Yhdistelm\u00e4tapahtumalla ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.compoundEvent.prefix=Yhdistelm\u00e4tapahtuma ''{0}'': {1} -emport.mailingList.xid=Postituslistalla ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.mailingList.xid=Postituslistalla ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.mailingList.prefix=Postituslista ''{0}'': {1} -emport.eventHandler.xid=Pistelinkill\u00e4 ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.eventHandler.xid=Pistelinkill\u00e4 ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.eventHandler.prefix=Pistelinkki ''{0}'': {1} -emport.publisher.xid=Datal\u00e4hde nimell\u00e4 ''{0}'' ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. -emport.publisher.missingType=Julkaisija XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa eik\u00e4 sill\u00e4 ole 'type'-arvoa. Sallitut arvot ovat {1} -emport.publisher.invalidType=Julkaisija XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa ja sill\u00e4 on virheellinen 'type'-arvo:''{1}''. Sallitut arvot ovat {2} +emport.publisher.xid=Datal\u00e4hde nimell\u00e4 ''{0}'' ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.publisher.missingType=Julkaisija XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa eik\u00e4 sill\u00e4 ole ’type’-arvoa. Sallitut arvot ovat {1} +emport.publisher.invalidType=Julkaisija XID:ll\u00e4 ''{0}'' ei ole viel\u00e4 olemassa ja sill\u00e4 on virheellinen ’type’-arvo:''{1}''. Sallitut arvot ovat {2} emport.publisher.prefix=Julkaisija ''{0}'': {1} -emport.watchList.xid=Seurannalla ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.watchList.xid=Seurannalla ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.watchList.prefix=Seuranta ''{0}'': {1} -emport.maintenanceEvent.xid=Yll\u00e4pitotapahtumalla ei ole 'xid'-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. +emport.maintenanceEvent.xid=Yll\u00e4pitotapahtumalla ei ole ’xid’-arvoa. J\u00e4tet\u00e4\u00e4n huomioimatta. emport.maintenanceEvent.prefix=Yll\u00e4pitotapahtuma ''{0}'': {1} eventHandlers.recipTestEmailMessage=T\u00e4m\u00e4 viesti on l\u00e4hetettu testin\u00e4 tapahtumak\u00e4sittelij\u00e4n postituslistalta @@ -1270,8 +1270,7 @@ login.loginButton=Kirjaudu login.unknownBrowser=Tarkistetaan selaimen yhteensopivuus... login.supportedBrowser=T\u00e4m\u00e4 selain on tuettu. login.unsupportedBrowser=Selaimesi voi toimia, mutta ei ole viralliesti Serotonin Softwaren tukema. \ - Suosittelemme k\u00e4ytt\u00e4m\u00e4\u00e4n Firefox, Chrome, tai \ -Internet Explorer 7. + Suosittelemme k\u00e4ytt\u00e4m\u00e4\u00e4n Mozilla Firefox, Google Chrome. login.nag=Huom: Koska selaimesi ei ole virallisesti tuettu, on mahdollista, ett\u00e4 aiheutuu ongelmia ScadaLTS kanssa. Kehotamme p\u00e4ivitt\u00e4m\u00e4\u00e4n selaimen. mailingLists.added=Postituslista lis\u00e4tty @@ -1339,7 +1338,7 @@ notes.cancel=Peruuta notes.timeByUsername=time by username notification.newui.title=New page is available! notification.newui.move=Move! -notification.newui.dontshow=Don't show again. +notification.newui.dontshow=Don’t show again. pointDetails.recordCountError=Tallenteiden m\u00e4\u00e4r\u00e4 pit\u00e4\u00e4 olla numero pointDetails.timePeriodError=Aikajakso pit\u00e4\u00e4 olla numero pointDetails.imageCountError=Kuvam\u00e4\u00e4r\u00e4 pit\u00e4\u00e4 olla numero @@ -1375,7 +1374,7 @@ pointDetails.accessType=P\u00e4\u00e4sy pointEdit.buttons.enable=P\u00e4\u00e4lle pointEdit.buttons.disable=Pois k\u00e4yt\u00f6st\u00e4 pointEdit.buttons.restart=Uudelleenk\u00e4ynnistys -pointEdit.buttons.note=Huom: Pisteen tallentaminen, sammuttaminen tai uudelleenk\u00e4ynnistys asettaa kaikki tapahtumat takaisin normaaliin. +pointEdit.buttons.note=pisteen tallentaminen, sammuttaminen tai uudelleenk\u00e4ynnistys asettaa kaikki tapahtumat takaisin normaaliin. pointEdit.chart.props=Kaavion asetukset pointEdit.chart.type=Tyyppi @@ -1528,7 +1527,7 @@ pointHierarchySLTS.dataSource=Data source pointHierarchySLTS.xid=XID pointHierarchySLTS.type=Type pointHierarchySLTS.changeOfLanguageFailed=Change of language failed -pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don't remove data point in root hierarchy +pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don’t remove data point in root hierarchy pointHierarchySLTS.moveDataPointToRoot=Move the element to root level tree pointHierarchySLTS.areYouSureToMoveElement=Are you sure to move element? pointHierarchySLTS.movedElement=Moved element @@ -1725,7 +1724,7 @@ scheduledEvents.validate.inactiveTrigger=Virhe luotaessa palautumisliipaisin: {0 scheduledEvents.validate.aliasTooLong=Alias ei voi olla pidempi kuin 50 merkki\u00e4 scheduledEvents.validate.invalidRtn=Palautumisaika pit\u00e4\u00e4 olla ennen aktivointiaikaa -sql.warning=Varoitus: k\u00e4yt\u00e4 t\u00e4t\u00e4 ominaisuutta omalla vastuulla. Virheellinen k\u00e4ytt\u00f6 voi aiheuttaa tietojen h\u00e4vi\u00e4mist\u00e4 ja/tai j\u00e4rjestelm\u00e4vian. +sql.warning= k\u00e4yt\u00e4 t\u00e4t\u00e4 ominaisuutta omalla vastuulla. Virheellinen k\u00e4ytt\u00f6 voi aiheuttaa tietojen h\u00e4vi\u00e4mist\u00e4 ja/tai j\u00e4rjestelm\u00e4vian. sql.sql=SQL sql.query=L\u00e4het\u00e4 kysely sql.update=L\u00e4het\u00e4 p\u00e4ivitys @@ -1743,8 +1742,8 @@ systemSettings.upToDate=Mango on ajantasainen systemSettings.emailSettings=S\u00e4hk\u00f6postiasetukset systemSettings.smtpHost=SMTP palvelin systemSettings.smtpPort=SMTP portti -systemSettings.fromAddress='Kenelt\u00e4'-osoite -systemSettings.fromName='Kenelt\u00e4'-nimi +systemSettings.fromAddress=’Kenelt\u00e4’-osoite +systemSettings.fromName=’Kenelt\u00e4’-nimi systemSettings.auth=K\u00e4yt\u00e4 tunnuksia systemSettings.smtpUsername=K\u00e4ytt\u00e4j\u00e4 systemSettings.smtpPassword=Salasana @@ -1907,7 +1906,7 @@ viewEdit.compound.duration=Jakso views.title=Graafiset n\u00e4yt\u00f6t views.newView=Uusi n\u00e4ytt\u00f6 -views.noViews=Et ole luonut viel\u00e4 yht\u00e4\u00e4n n\u00e4ytt\u00f6\u00e4. Tee nyt. +views.noViews=Et ole luonut viel\u00e4 yht\u00e4\u00e4n n\u00e4ytt\u00f6\u00e4. Tee watchlist.addToWatchlist=Lis\u00e4\u00e4 seurantaan watchlist.points=Pisteet @@ -2018,7 +2017,7 @@ event.system.process=Prosessi-tapahtuman virhe event.audit.added=K\u00e4ytt\u00e4j\u00e4 "{0}" loi kohteen "{1} Id:{2}", asetuksilla: {3} event.audit.changed=K\u00e4ytt\u00e4j\u00e4 "{0}" muutti kohteen "{1} Id:{2}", asetuksia: {3} -event.audit.changedProperty=
    {0}: "{1}" --> "{2}" +event.audit.changedProperty={0}: "{1}" --> "{2}" event.audit.compoundEventDetector=Yhdistem\u00e4tapahtuma event.audit.dataPoint=Piste event.audit.dataSource=Datal\u00e4hde @@ -2027,7 +2026,7 @@ event.audit.eventHandler=Tapahtumak\u00e4sittelij\u00e4 event.audit.maintenanceEvent=Yll\u00e4pitotapahtuma event.audit.pointEventDetector=Pistetapahtuma event.audit.pointLink=Pistelinkki -event.audit.property=
    {0}="{1}" +event.audit.property={0}="{1}" event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2587,8 +2586,8 @@ engUnit.188=newtons per meter engUnit.189=watts per meter per degree kelvin engUnit.190=kilometers -engUnit.abbr.0=m2 -engUnit.abbr.1=f2 +engUnit.abbr.0=m\u00b2 +engUnit.abbr.1=ft\u00b2 engUnit.abbr.2=mA engUnit.abbr.3=A engUnit.abbr.4=ohms @@ -3109,7 +3108,7 @@ viewEdit.graphic.whenOffLabel=Label when OFF (0, false) viewEdit.graphic.text=Text script.dpCommands=Datapoints commands dsEdit.nodaves7.writeBaseCmd=Write command line -emport.versionError=The project version ({0}) isn't compatible with current system version ({1}) +emport.versionError=The project version ({0}) isn’t compatible with current system version ({1}) events.export.ackedByDeletedUser=(user deleted) dsEdit.jmx.attributeName=Attribute name dsEdit.opc.tagName=Tag Name @@ -3465,4 +3464,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor +pointEdit.buttons.note.prefix=Huom: +sql.warning.prefix=Varoitus: +views.noViews.prefix=nyt. annotation.api=REST API +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/messages_fr.properties b/test/messages_fr.properties index f4648031bd..0d78c21ea5 100644 --- a/test/messages_fr.properties +++ b/test/messages_fr.properties @@ -106,7 +106,7 @@ common.gettingData=Obtenir les données common.help=Aide common.imageChart=Image de chart common.inactive=Inactive -common.inactiveTime=Période d'inactivité +common.inactiveTime=Période d’inactivité common.inception=Origine;Création common.latest=Fin common.maximize=Etendre @@ -151,14 +151,14 @@ common.stats.end=Fin common.stats.logEntries=Entrées de journal common.stats.max=Maximum common.stats.min=Minimum -common.stats.runtime=Durée d'exécution +common.stats.runtime=Durée d’exécution common.stats.start=Début common.stats.starts=Débute common.stats.sum=Somme common.stats.value=Valeur common.status=Status common.testEmailSent=E-mail de test a été envoyé''{0}'' -common.thumb.invalidValue=Valeur de consigne n'est pas une image +common.thumb.invalidValue=Valeur de consigne n’est pas une image common.time=Date common.tp.day=jour common.tp.days=jour(s) @@ -732,7 +732,7 @@ dsEdit.mbus.vifeTypes=Types Vif dsEdit.mbus.vifLabel=Etiquette vif dsEdit.mbus.vifType=Type Vif dsEdit.mbus=MBus -dsEdit.meta.delay=Délai d’éxécution
+dsEdit.meta.delay=Délai d’éxécution dsEdit.meta.desc=Propriétés de source de données Meta dsEdit.meta.event.context=Mise à jour de contexte dsEdit.meta.event.cron=Modèle Cron @@ -743,7 +743,7 @@ dsEdit.meta.event=Mise à jour évènement dsEdit.meta.event.week=Début de la semaine dsEdit.meta.event.year=Début de l’année dsEdit.meta.event.month=Début du mois -dsEdit.meta.noPoints=Aucun point n'a été ajouté au contexte de script +dsEdit.meta.noPoints=Aucun point n’a été ajouté au contexte de script dsEdit.meta.pointName=Nom du point dsEdit.meta.script=Script dsEdit.meta.scriptContext=Contexte du script @@ -854,7 +854,7 @@ dsEdit.modbusSerial.parity.space=Espace dsEdit.modbusSerial.parity=Parité dsEdit.modbusSerial.port=Port dsEdit.modbus.settableOverride=Settable -dsEdit.modbusSerial.stopBits=Bits d'arrêt +dsEdit.modbusSerial.stopBits=Bits d’arrêt dsEdit.name=Nom dsEdit.nmea.baud=Vitesse de transmission dsEdit.nmea.binary0Value=Valeur 0 binaire @@ -1077,8 +1077,8 @@ dsEdit.updatePeriod=Mise à jour période dsEdit.validate.required=Valeur requise dsEdit.viconics.channel=Canal viconics dsEdit.viconics.chipRevision=Révision Chip viconics -dsEdit.viconics.chipRevisionBr=Chip
révision viconics -dsEdit.viconics.commAddress=Comm
adresse viconics +dsEdit.viconics.chipRevisionBr=Chip révision viconics +dsEdit.viconics.commAddress=Comm adresse viconics dsEdit.viconics.convertCelsius=Convertir températures en Celsius dsEdit.viconics.crss=CRSS Viconics dsEdit.viconics.dataSourceNotStarted=Source des données n’est pas démarré @@ -1087,9 +1087,9 @@ dsEdit.viconics.deviceRemove=supprimer le périphérique (s) dsEdit.viconics.devices=Périphériques viconics dsEdit.viconics.deviceWarning=Délai de périphérique déconnecté(s) dsEdit.viconics.dpconn=Port: {0}, PAN ID: {1}, Canal: {2} -dsEdit.viconics.firmwareRevision=Firmware
révision +dsEdit.viconics.firmwareRevision=Firmware révision dsEdit.viconics.ieee=IEEE viconics -dsEdit.viconics.modelNumber=Model
numéro +dsEdit.viconics.modelNumber=Model numéro dsEdit.viconics.networkIdentifyFailure=Identification réseau échoué: {0} dsEdit.viconics.networkInfo=Information réseau dsEdit.viconics.networkTimeout=Délai de réseau déconnecté(s) @@ -1103,9 +1103,9 @@ dsEdit.viconics.timeout=Délai message viconics dsEdit.viconics.trss=TRSS viconics dsEdit.viconics.unreliable=Valeur du point peut ne pas être fiable dsEdit.viconics.zigbeeFirmwareRevision=Zigbee révision firmware -dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee
firmware
révision +dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee firmware révision dsEdit.viconics.zigbeeNetworkAddress=Zigbee adresse réseau -dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee
network
adresse +dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee network adresse dsEdit.viconics=Viconics thermostats sans fil dsEdit.virtual.attractionPoint=Point d’attraction dsEdit.virtual.change=Changement virtuelle @@ -1250,7 +1250,7 @@ emport.importProjectTitle=Importer projet (Upload) emport.includePointValues=Inclure valeurs de points emport.indent=Niveau de retrait emport.invalidFile=Lecture de fichier échoué ({0}) -emport.invalidImportData=Importer des données n’est pas valide: n’est pas un objet JSON +emport.invalidImportData=Importer des données n’est pas valide: n’est pas un objet JSON. (www.json.org) emport.invalidProjectName=Nom invalide emport.mailingList.prefix=Liste de diffusion ''{0}'': {1} emport.mailingList.xid=Une liste de diffusion n’a pas de valeur ‘xid’. Ignoré. @@ -1266,7 +1266,7 @@ emport.pointValuesMax=Valeurs max de points emport.projectDescription=Description emport.projectName=Nom de projet emport.publisher.invalidType=Éditeur avec XID ''{0}'' n’existe pas et a une valeur non valide ""type"" de ''{1}''. Les types valides sont {2} -emport.publisher.missingType=Éditeur avec XID'' {0}''n’existe pas encore et n’a pas de valeur ‘type’. Les types valides sont {1} +emport.publisher.missingType=Éditeur avec XID'' {0}'' n’existe pas encore et n’a pas de valeur ‘type’. Les types valides sont {1} emport.publisher.prefix=Éditeur ''{0}'': {1} emport.publisher.xid=Une source de données avec nom ''{0}'' ne pas avoir de valeur ‘xid’. Ignoré. emport.saved=sauvegardé @@ -1483,8 +1483,8 @@ engUnit.99=pourcent par seconde engUnit.190=kilomètres engUnit.abbr.190=km -engUnit.abbr.0=m2 -engUnit.abbr.1=f2 +engUnit.abbr.0=m\u00b2 +engUnit.abbr.1=ft\u00b2 engUnit.abbr.10=mégavolt ampères engUnit.abbr.100=par minute engUnit.abbr.101=par seconde @@ -1705,7 +1705,7 @@ event.alarmMaxDecreased=Niveau d’alarme maximal a diminué de {0} vers {1} event.alarmMaxIncreased=Niveau d’alarme maximal a augmenté de {0} vers {1} event.audit.added=Utilisateur ""{0}"" créé {1} avec id {2}: {3} event.audit.changed=Utilisateur ""{0}"" changé {1} avec id {2}: {3} -event.audit.changedProperty=
""{0}"" ""{1}"" à ""{2}"" +event.audit.changedProperty= ""{0}"" ""{1}"" à ""{2}"" event.audit.compoundEventDetector=Détecteur d’évènement du composé event.audit.dataPoint=Point de données event.audit.dataSource=Source de données @@ -1714,7 +1714,7 @@ event.audit.eventHandler=Gestionnaire d’évènements event.audit.maintenanceEvent=Évènement de maintenance event.audit.pointEventDetector=Point de détecteur d’évènements event.audit.pointLink=Point de lien -event.audit.property=
""{0}""=""{1}"" +event.audit.property= ""{0}""=""{1}"" event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2081,7 +2081,7 @@ ftl.eventActive=Scada-LTS notification d’évènements actif ftl.eventInactive=Cet évènement est inactif à ce moment ftl.footer=Si vous avez reçu ce message par erreur, s’il vous plaît ne pas tenir compte. ftl.htmlFooter.automated=Cet e-mail a été envoyé par un système automatique. Il a été envoyé vers vous parce que vous avez été inscrit sur la liste d’envoi d’une notification d’e-mail Scada-LTS. S’il vous plaît ne répondez pas à cet e-mail. -ftl.htmlFooter.mango=Scada-LTS (by Abil'I.T.) +ftl.htmlFooter.mango=Scada-LTS (by Abil’I.T.) ftl.manual=Cet évènement nécessite une confirmation manuelle pour qu’il devienne inactif ftl.note=Note ftl.originalInformation=Origine d’informations d’évènement @@ -2162,7 +2162,7 @@ header.scripts=Scripte header.setHomeUrl=Faire de ceci ma page de défaut header.sql=SQL header.systemSettings=Paramètres du système -header.title=Scada-LTS (by Abil'I.T.) +header.title=Scada-LTS (by Abil’I.T.) header.toggleMute=Mute header.unmute=Réactiver header.user=Utilisateur @@ -2191,7 +2191,7 @@ login.nag=NOTE: vous pouvez avoir des problèmes avec ScadaLTS parce que votre n login.password=Mot de passe login.supportedBrowser=Ce navigateur est supporté. login.unknownBrowser=Vérification de votre navigateur pour la compatibilité... -login.unsupportedBrowser=Ce navigateur devrait fonctionner, mais n'est pas officiellement supporté. Nous vous recommandons d'utiliser Firefox ou Chrome. +login.unsupportedBrowser=Ce navigateur devrait fonctionner, mais n'est pas officiellement supporté. Nous vous recommandons d'utiliser Mozilla Firefox, Google Chrome. login.userId=Id de l’utilisateur login.validation.accountDisabled=Votre compte a été désactivé. S’il vous plaît contactez votre administrateur login.validation.invalidLogin=Connexion incorrecte, s’il vous plaît essayer à nouveau @@ -2247,7 +2247,7 @@ maintenanceEvents.type.year=Annuel maintenanceEvents.type=Type planifié maintenanceEvents.validate.activeCron=Erreur dans l’expression cron active: {0} maintenanceEvents.validate.activeTrigger=Erreur de création de déclencheur actif: {0} -maintenanceEvents.validate.aliasTooLong=Alias trop long +maintenanceEvents.validate.aliasTooLong=Alias trop long (ne peut pas contenir plus de 50 caractères) maintenanceEvents.validate.inactiveCron=Erreur dans l’expression cron inactive: {0} maintenanceEvents.validate.inactiveTrigger=Erreur de création de déclencheur inactif: {0} maintenanceEvents.validate.invalidRtn=Temps d’inactivité doit être après le temps d’activité @@ -2261,7 +2261,7 @@ notes.timeByUsername=Temps par utilisateur notes.userNotes=Notes d’utilisateur notification.newui.title=New page is available! notification.newui.move=Move! -notification.newui.dontshow=Don't show again. +notification.newui.dontshow=Don’t show again. pagination.ascending=Ascendant pagination.descending=Descendant pagination.next=Prochain @@ -2303,7 +2303,7 @@ pointDetails.username=Nom d’utilisateur pointDetails.views=Vues pointEdit.buttons.disable=Déscativer pointEdit.buttons.enable=Activer -pointEdit.buttons.note=Note: la sauvegarde, la désactivation, ou le redémarrage d’un point entraîne tous les évènements actifs à retourner à la normale +pointEdit.buttons.note=la sauvegarde, la désactivation, ou le redémarrage d’un point entraîne tous les évènements actifs à retourner à la normale pointEdit.buttons.restart=Redémarrer pointEdit.chart.includeSum=Inclure somme pointEdit.chart.invalidLimit=Tableau rendu: limite doit être entre 2 et 50 @@ -2553,7 +2553,7 @@ reports.commentList.type.event=Évèvenement reports.commentList.type.point=Point reports.commentList.type=Type reports.commentList.typeKey=Taper clé -reports.comments=Commentaires d'utilisateur +reports.comments=Commentaires d’utilisateur reports.consolidated=Tableau consolidé reports.consolidatedChart=Diagramme consolidé reports.criteria=Critères de rapport @@ -2665,7 +2665,7 @@ sql.query=Envoyer requête sql.rowsUpdated=Enregistrement(s) à jour. sql.sql=SQL sql.update=Envoyer mise à jour -sql.warning=Attention: utiliser cette fonction à vos risques. Une utilisation incorrecte peut entraîner des données corrompues et/ou des failles de système. +sql.warning=utiliser cette fonction à vos risques. Une utilisation incorrecte peut entraîner des données corrompues et/ou des failles de système. systemSettings.auditAlarmLevels=Niveaux d’alarmes d’évènements d’audit systemSettings.auditAlarmLevelsSaved=Niveaux d’alarmes d’évènements d’audit ont été sauvegardés systemSettings.auth=Autorisation d’utilisation @@ -2684,11 +2684,11 @@ systemSettings.fromAddress="De" adresse systemSettings.fromName="De" nom systemSettings.futureDateLimit=Jeter valeurs de points futures datées de plus de systemSettings.groveLogging=Envoyer erreurs à Sérotonine -systemSettings.historyCount=Compte de l'histoire +systemSettings.historyCount=Compte de l’histoire systemSettings.httpSaved=Paramètres Http ont été sauvegardés systemSettings.httpSettings=Paramètres HTTP -systemSettings.instanceDescription=Description de l'instance -systemSettings.instanceId=Identifiant de l'instance +systemSettings.instanceDescription=Description de l’instance +systemSettings.instanceId=Identifiant de l’instance systemSettings.langSaved=Langue a été sauvegardée systemSettings.languageSettings=Paramètres de langue systemSettings.miscSaved=les Paramètres ont été sauvegardés @@ -2700,11 +2700,11 @@ systemSettings.otherSettings=Autres paramètres systemSettings.proxyHost=Hôte proxy systemSettings.proxyPassword=Mot de passe proxy systemSettings.proxyPort=Port proxy -systemSettings.proxyUsername=Nom d'utilisateur proxy +systemSettings.proxyUsername=Nom d’utilisateur proxy systemSettings.purgeData=Purger toutes les données systemSettings.purgeDataComplete=Purge totale. {0} échantillons de points supprimés. systemSettings.purgeDataConfirm=Cela purgera tous les échantillons de points de la base de données. Etes-vous sûr? -systemSettings.purgeDataInProgress=Purge toutes les données, s'il vous plaît attendre... +systemSettings.purgeDataInProgress=Purge toutes les données, s’il vous plaît attendre... systemSettings.purgeEvents=Purger évènements plus vieux que systemSettings.purgeNow=Purger maintenant en utilisant des paramètres de point systemSettings.purgeReports=Purger les instances de rapport plus vieilles que @@ -2712,9 +2712,9 @@ systemSettings.retrieving=(récupération) systemSettings.smtpHost=Hôte SMTP systemSettings.smtpPassword=Mot de passe systemSettings.smtpPort=Port SMTP -systemSettings.smtpUsername=Nom d'utilisateur -systemSettings.systemAlarmLevels=Niveaux d'alarmes d'évènements du système -systemSettings.systemAlarmLevelsSaved=Niveaux d'alarmes d'évènements du système ont été sauvegardés +systemSettings.smtpUsername=Nom d’utilisateur +systemSettings.systemAlarmLevels=Niveaux d’alarmes d'évènements du système +systemSettings.systemAlarmLevelsSaved=Niveaux d’alarmes d'évènements du système ont été sauvegardés systemSettings.systemInformation=Informations du système systemSettings.systemLanguage=Langage du système systemSettings.testEmail=Un e-mail de test avec vos paramètres du système a été envoyé avec succès. @@ -2724,16 +2724,16 @@ systemSettings.totalSize=Taille totale systemSettings.uiPerformance.high=Haute systemSettings.uiPerformance.low=Basse systemSettings.uiPerformance.med=Moyenne -systemSettings.uiPerformance=Performance de l'UI +systemSettings.uiPerformance=Performance de l’UI systemSettings.upToDate=Cette instance de Scada-LTS est à jour systemSettings.useProxy=Utiliser proxy systemSettings.validation.invalidColour=Couleur invalide -systemSettings.versionCheck1=Temps de pause du socket lors d'un contrôle. S'il vous plaît essayer à nouveau -systemSettings.versionCheck2=Une erreur s'est produite: {0}: {1} +systemSettings.versionCheck1=Temps de pause du socket lors d’un contrôle. S’il vous plaît essayer à nouveau +systemSettings.versionCheck2=Une erreur s’est produite: {0}: {1} systemSettings.versionSaved=Paramètres de version ont été sauvés textRenderer.analog=Analogue textRenderer.binary=Binaire -textRenderer.engineeringUnits=Unités d'ingénierie +textRenderer.engineeringUnits=Unités d’ingénierie textRenderer.multistate=Multi-état textRenderer.none=Aucun textRenderer.plain=Ordinaire @@ -2743,12 +2743,12 @@ users.add=Ajouter utilisateur users.added=Utilisateur ajouté users.dataSources=Source de données users.deleteConfirm=Etes-vous sûr de vouloir supprimer cet utilisateur? -users.details=Détails d'utilisateur +users.details=Détails d’utilisateur users.email=E-mail users.newPassword=Nouveau mot de passe users.phone=Téléphone -users.receiveAlarmEmails=Envoyer des e-mails d'alarme -users.receiveOwnAuditEvents=Recevez propres évènements d'audit +users.receiveAlarmEmails=Envoyer des e-mails d’alarme +users.receiveOwnAuditEvents=Recevez propres évènements d’audit users.hideMenu=Masquer le menu users.theme=Thème users.theme.default=Défaut @@ -2757,19 +2757,19 @@ users.homeUrl=Home URL users.saved=Utilisateur sauvegardé users.title=Utilisateur users.user=Utilisateur -users.username=Nom d'utilisateur +users.username=Nom d’utilisateur users.firstName=Prénom users.lastName=Nom de famille users.validate.adminDisable=Vous ne pouvez pas désactiver votre compte -users.validate.adminInvalid=Vous ne pouvez pas supprimer vos propres privilèges d'administrateur +users.validate.adminInvalid=Vous ne pouvez pas supprimer vos propres privilèges d’administrateur users.validate.badDelete=Vous ne pouvez pas effacer votre compte users.validate.emailRequired=E-mail est requis users.validate.emailTooLong=E-mail ne peut pas contenir plus de 255 caractères users.validate.phoneTooLong=Téléphone ne peut pas être plus long que 40 caractères -users.validate.usernameInUse=Nom d'utilisateur est déjà  utilisé -users.validate.usernameRequired=Nom d'utilisateur est requis -users.validate.usernameTooLong=Nom d'utilisateur ne peut pas contenir plus de 40 caractères -users.validate.usernameUnique=Nom d'utilisateur doit être unique +users.validate.usernameInUse=Nom d’utilisateur est déjà  utilisé +users.validate.usernameRequired=Nom d’utilisateur est requis +users.validate.usernameTooLong=Nom d’utilisateur ne peut pas contenir plus de 40 caractères +users.validate.usernameUnique=Nom d’utilisateur doit être unique validate.0to15=Doit être entre 0 et 15 inclus validate.0toArg=Doit être entre 0 et {0} inclus validate.1to240=Doit être entre 1 et 240 inclus @@ -2788,15 +2788,15 @@ validate.duplicateVarName=Duplicat de nom de variable: {0} validate.fieldName=Un des noms de domaine de requête ou de déclaration de mise à jour doivent être fournis validate.greaterThan1s=Ne peut pas être moins que 2 secondes validate.greaterThanDiscardLow=Doit être supérieur à limite basse d'écart -validate.greaterThanEngLow=Doit être supérieur à l'échelle d'ingénierie d'unité de valeur faible +validate.greaterThanEngLow=Doit être supérieur à l'échelle d’ingénierie d’unité de valeur faible validate.greaterThanRawLow=Doit être supérieur à l'échelle de valeur brute faible validate.greaterThanZero=Doit être supérieur à zéro validate.illegalValue=Valeur illégale -validate.imageExtension=Format d'image invalide! +validate.imageExtension=Format d’image invalide! validate.invalidAddress=Adresse de capteur invalide: {0} validate.invalidCharset=Ensemble de noms de caractères invalide validate.invalidChoice=Choix invalide -validate.invalidCron=Erreur dans l'expression de cron: {0} +validate.invalidCron=Erreur dans l’expression de cron: {0} validate.invalidValue=Valeur invalide validate.invalidVarName=Nom de variable non valide: {0} validate.lessThan100=Ne peut pas être > 100 @@ -2809,7 +2809,7 @@ validate.notLessThan30s=Ne peut pas être moins que 30 secondes validate.notLongerThan=Ne peut pas contenir plus de {0} caractères validate.pachube.dataStreadIdRequired=id de flux de données est requis validate.parameterRequired=Nom de paramètre est requis -validate.parseError=Erreur d'analyse: {0} +validate.parseError=Erreur d’analyse: {0} validate.ped.xidMissing=Tous les détecteurs d'évènements doivent définir un XID. Non sauvegardé validate.ped.xidUsed=Le même XID ''{0}'' est en utilisation pour multiples détecteurs d'évènements. Non sauvegardés validate.required=Valeur requise @@ -2842,12 +2842,12 @@ viewEdit.graphic.height=Hauteur viewEdit.graphic.hideAckColumn=Cacher colonne Ack viewEdit.graphic.hideAlarmLevelColumn=Cacher colonne de niveau viewEdit.graphic.hideIdColumn=Cacher ID de colonne -viewEdit.graphic.hideInactivityColumn=Cacher colonne d'inactivité +viewEdit.graphic.hideInactivityColumn=Cacher colonne d’inactivité viewEdit.graphic.hideTimestampColumn=Cacher la colonne des horodatages viewEdit.graphic.image=Image viewEdit.graphic.images=Images -viewEdit.graphic.imageSample=Échantillon d'image -viewEdit.graphic.imageSet=Ensemble d'images +viewEdit.graphic.imageSample=Échantillon d’image +viewEdit.graphic.imageSet=Ensemble d’images viewEdit.graphic.invalidMinMax=Min doit être inférieur au Max viewEdit.graphic.invalidScale=Pourcentage d'échelle ne peut pas être inférieur à 1 viewEdit.graphic.invalidState=Valeur d'état non analysable en @@ -2857,7 +2857,7 @@ viewEdit.graphic.maxListSize=Taille max de liste viewEdit.graphic.min=Min viewEdit.graphic.missingDefault=Une image de défault doit être sélectionnée viewEdit.graphic.missingDynamicImage=Vous devez selectionner une image dynamique -viewEdit.graphic.missingImageSet=Vous devez selectionner un ensemble d'images +viewEdit.graphic.missingImageSet=Vous devez selectionner un ensemble d’images viewEdit.graphic.missingMax=Max doit être saisi viewEdit.graphic.missingMin=Min doit être saisi viewEdit.graphic.missingOneImage=Une image une doit être sélectionnée @@ -2873,7 +2873,7 @@ viewEdit.graphic.runtimeMode=Mode temps de lecture viewEdit.graphic.saveToLoad=Sauvegardez vue pour charger composante! viewEdit.graphic.scale=Le Pourcentage d'échelle viewEdit.graphic.script=Le Script -viewEdit.graphic.state=Missions d'image/état +viewEdit.graphic.state=Missions d’image/état viewEdit.graphic.stateList=Liste d'état viewEdit.graphic.styleAttribute=Attribut de style viewEdit.graphic.text=Texte @@ -2898,7 +2898,7 @@ viewEdit.viewDelete=Supprimer la vue: viewEdit.viewDeleteConfirm=Confirmer viedEdit.viewSize=La Taille views.newView=Nouvelle vue -views.noViews=Vous n'avez pas créé de vues graphiques. En créer now. +views.noViews=Vous n'avez pas créé de vues graphiques. En créer views.title=Vues de graphique watchlist.addNewList=Ajouter nouvelle liste de surveillance watchlist.addToWatchlist=Ajouter à la liste de surveillance @@ -2928,44 +2928,44 @@ dox.radiuinoDS=Source de données Radiuino dox.radiuinoPP=Point de données Radiuino dox.scripts=Scripts dsEdit.asciiSerial.charStopMode.charASCII=Caractère ASCII -dsEdit.asciiSerial.charX=Jusqu'au caractère C +dsEdit.asciiSerial.charX=Jusqu’au caractère C dsEdit.bacnetIp.gettingDeviceDetails=Récupération des informations sur les appareils... dsEdit.bacnetIp.remoteDeviceNetworkAddress=Adresse du réseau dsEdit.bacnetIp.remoteDeviceNetworkNumber=Numéro de réseau dsEdit.iec101.persistent=Persistant -dsEdit.mbus.id=Identification de l'appareil +dsEdit.mbus.id=Identification de l’appareil dsEdit.mbus.man=Man dsEdit.mbus.phoneNumber=Numéro de téléphone dsEdit.mbus.responseTimeOutOffset=Décalage de temps -dsEdit.mbus.secAddrMedium=Support d'adresse sécondaire +dsEdit.mbus.secAddrMedium=Support d’adresse sécondaire dsEdit.mbus.tcpAddr=Adresse TCP dsEdit.mbus.tcpIpBitPerSecond=Bit par séconde du TCP IP dsEdit.mbus.tcpPort=Port du TCP dsEdit.mbus.useTcpIpConnection=Utiliser une connexion TCP/IP dsEdit.mbus.version=Version -dsEdit.meta.generate.error=Erreur de création de l'histoire: {0}. {1} Mises à jour créées. -dsEdit.meta.generate=Générer l'histoire +dsEdit.meta.generate.error=Erreur de création de l’histoire: {0}. {1} Mises à jour créées. +dsEdit.meta.generate=Générer l’histoire dsEdit.meta.generate.noData=Pas de données pour le point ''{0}'' -dsEdit.meta.generate.success=L'histoire a été créées avec succès. {0} Mises à jour créées. +dsEdit.meta.generate.success=L’histoire a été créées avec succès. {0} Mises à jour créées. dsEdit.meta=Méta source de données dsEdit.modbus.dpconn3=Contrôle des connexions dsEdit.modbusIp.createSocketMonitorPoint=Créer un point de surveillance des prises dsEdit.modbusIp.socketPointName=Surveillances des prises TCP dsEdit.modbusIp.transportType.tcpListener=Auditeur TCP -dsEdit.modbus.scanner.startError=Un problème d'exploration s'est posé. Il est possible qu'il y ait une source de données active utilisant le port sélectionné. ({0}) +dsEdit.modbus.scanner.startError=Un problème d’exploration s’est posé. Il est possible qu’il y ait une source de données active utilisant le port sélectionné. ({0}) dsEdit.modbusSerial=Série de Modbus dsEdit.nodaves7.desc=S7 Iso TCP Ethernet dsEdit.nodaves7=Contrôleur Ethernet S7 Iso TCP dsEdit.nodaves7.s7writeBitOffset=Bit de décalage -dsEdit.nodaves7.s7writeBytesQty=Quantité d'octets +dsEdit.nodaves7.s7writeBytesQty=Quantité d’octets dsEdit.nodaves7.s7writeDBNUM=DBNUM dsEdit.nodaves7.s7writeMemoryArea=Zone de mémoire dsEdit.nodaves7.s7writeStarts=Décalage de la mémoire (Démarrage) dsEdit.nodaves7.writeBaseCmd=Write command line -dsedit.opc.rt.addFailed=L'ajout a échoué pour{0} +dsedit.opc.rt.addFailed=L’ajout a échoué pour{0} dsEdit.persistent.getStatus=Obtenir un statut dsEdit.persistent.status.connection={0}: connexions {1}, {2} paquet reçu -dsEdit.persistent.status=État d'exécution +dsEdit.persistent.status=État d’exécution dsEdit.persistent.status.noConnections=Pas de connexions dsEdit.persistent.status.notEnabled=Les sources de données ne sont pas activées dsEdit.radiuino.avancado=Avancé @@ -2983,7 +2983,7 @@ dsEdit.radiuino.parity=Parité dsEdit.radiuino.pollingMode.false=Faux dsEdit.radiuino.pollingMode=Mode de sondage dsEdit.radiuino.pollingMode.true=Vrai -dsEdit.radiuino.quantidadeByte=Quantité d'octets +dsEdit.radiuino.quantidadeByte=Quantité d’octets dsEdit.radiuino=Radiuino dsEdit.radiuino.radiuinoDataType.1bUnsigned=Entier (non signé 1 octet) dsEdit.radiuino.radiuinoDataType.2bUnsigned=Entier (non signé 2 octets) @@ -2998,10 +2998,10 @@ dsEdit.radiuino.sleepMode.false=Sans repos dsEdit.radiuino.sleepMode=Mode veille dsEdit.radiuino.sleepMode.true=Avec repos dsEdit.radiuino.sleepTime=Temps de repos -dsEdit.radiuino.stopBits=Bits d'arrêt +dsEdit.radiuino.stopBits=Bits d’arrêt dsEdit.radiuino.timeout=Temps mort (ms) dsEdit.serial.flowControlIn=Contrôle des flux entrant -dsEdit.serial.inputBufferSize=Taille de la mémoire tampon d'entrée +dsEdit.serial.inputBufferSize=Taille de la mémoire tampon d’entrée dsEdit.serial.outputBufferSize=Taille du tampon de sortie Edit.chart.missingPeriods=La période de temps du graphique doit être fixée emport.pointValue.missingPoint=Valeur du point''{0}'': Point de données non trouvé @@ -3012,7 +3012,7 @@ event.persistent.xidTooLong=XID de ""{0}"" point est trop long. events.export.ackedByDeletedUser=(Utilisateur supprimé) events.export.ackedByMaintenance=Mode de maintenance events.export.ackedByUser={0} -events.export=Evènements sur l'exportation +events.export=Evènements sur l’exportation events.search.dateRange=Gamme de données events.search.dateRange.none=Aucune events.search.dateRange.relative=Relative @@ -3037,7 +3037,7 @@ graphic.enhancedImageChart.config.y.max=Y-axis max: graphic.enhancedImageChart.config.y.min=Y-axis min: graphic.enhancedImageChart.config.zoomIn=Zoom avant graphic.enhancedImageChart.config.zoomOut=Zoom arrière -graphic.enhancedImageChart=Charte d'image améliorée +graphic.enhancedImageChart=Charte d’image améliorée graphic.enhancedImageChart.legend=Légende graphic.enhancedImageChart.point10=Point 10 graphic.enhancedImageChart.point1=Point 1 @@ -3059,7 +3059,7 @@ graphic.enhancedImageChart.seriesConfig.seriesOptions=Options pour {0}: graphic.enhancedImageChart.seriesConfig.seriesOptions.strokeWidth=Largeur de la course: graphic.enhancedImageChart.seriesConfig.visibility=Visibilité des séries graphic.enhancedPoint=Point amélioré -login.validation.noSuchUser=Impossible de trouver l'identifiant de l'utilisateur +login.validation.noSuchUser=Impossible de trouver l’identifiant de l’utilisateur mport.graphicsFolder=Inclure les dossiers graphique mport.mailingList.prefix=Liste de courrier ''{0}'': {1} pointDetails.chartDataButton=Importer des données graphiques @@ -3074,21 +3074,21 @@ publisherEdit.httpSender.point.status=Statut publisherEdit.httpSender.point.type=Type publisherEdit.pachube.noPoints=Pas de liste de points publisherEdit.persistent.getStatus=Obtenir statut -publisherEdit.persistent.startSync=Synchroniser l'histoire +publisherEdit.persistent.startSync=Synchroniser l’histoire publisherEdit.persistent.status.connected=Connecté publisherEdit.persistent.status.connecting=Point Connecté{0} à {1} publisherEdit.persistent.status.connectionState=Connexion: {0} -publisherEdit.persistent.status=Etat d'exécution +publisherEdit.persistent.status=Etat d’exécution publisherEdit.persistent.status.notConnected=Pas connecté publisherEdit.persistent.status.notEnabled=Editeur désactivé -publisherEdit.persistent.status.packetQueueSize=Fil d'attente d'un paquet: {0} +publisherEdit.persistent.status.packetQueueSize=Fil d’attente d’un paquet: {0} publisherEdit.persistent.status.pointCount=Nombre de point: {0} -publisherEdit.persistent.status.queueSize=Mise à jour de la taille de la file d'attente: {0} -publisherEdit.persistent.status.syncNotRunning=La synchronisation de l'historique n'est pas active -publisherEdit.persistent.status.syncStatus=Statut de synchronisation de l'historique: Terminé {0} de {1} points, {2} demandes envoyées +publisherEdit.persistent.status.queueSize=Mise à jour de la taille de la file d’attente: {0} +publisherEdit.persistent.status.syncNotRunning=La synchronisation de l’historique n’est pas active +publisherEdit.persistent.status.syncStatus=Statut de synchronisation de l’historique: Terminé {0} de {1} points, {2} demandes envoyées publisherEdit.persistent.xidPrefix=XID préfixe reports.zipData=Données au format .zip -scripts.execution.scriptError=Echec de l'exécution du script +scripts.execution.scriptError=Echec de l’exécution du script scripts.execution.success=Script éxécuté avec succès systemSettings.chartBackgroundColour=Couleur de fond du graphique systemSettings.colourSettings=Configuration des couleurs @@ -3101,23 +3101,23 @@ systemSettings.dbConfiguration.Mysql=MySQL systemSettings.infoSaved=Les informations deconfiguration ont été sauvegardées systemSettings.plotBackgroundColour=Couleur de fond du tracé systemSettings.plotGridlinesColour=Couleur des lignes de quadrillage -systemSettings.reServer=Redémarrer le serveur d'application +systemSettings.reServer=Redémarrer le serveur d’application systemSettings.version=Version de ScadaLTS systemSettings.customCss.title=Feuille de style personnalisée systemSettings.customCss.edit=Modifier le fichier systemSettings.customCss.dialog.title=Modifier le fichier de feuille de style personnalisé -userProfiles.add=Ajouter un profil d'utilisateur -userProfiles.added=Profil d'utilisateur ajouté. -users.dataSaved=Données d'utilisateur sauvegardées +userProfiles.add=Ajouter un profil d’utilisateur +userProfiles.added=Profil d’utilisateur ajouté. +users.dataSaved=Données d’utilisateur sauvegardées userProfiles.dataSources=Source de données userProfiles.deleteConfirm=Êtes-vous sûr de vouloir supprimer ce profil ? -userProfiles.details=Détail du profil d'utilisateur +userProfiles.details=Détail du profil d’utilisateur userProfiles.name=Nom du profil userProfiles.none=Aucun userProfiles.saved=Profil sauvegardé -userProfiles.selectName=Profil d'utilisateur -userProfiles.title=Gérer le profil de l'utilisateur -userProfiles.validate.errorDeleting=Erreur de détection du profil de l'utilisateur! +userProfiles.selectName=Profil d’utilisateur +userProfiles.title=Gérer le profil de l’utilisateur +userProfiles.validate.errorDeleting=Erreur de détection du profil de l’utilisateur! userProfiles.validate.nameUnique=Le nom du profil doit être unique et non vide userProfiles.validate.successDeleting=Profil supprimé avec succès. viewEdit.compound.point.alias=Alias @@ -3133,7 +3133,7 @@ viewEdit.fullScreen=Plein écran watchlist.chartDataButton=Exporter les données des cartes watchlist.consolidatedChart=Inclure dans le tableau consolidé watchlist.createReport=Créer un rapport pour cette liste de surveillance -watchlist.noExportables=Aucun point sélectionné pour l'exploitation +watchlist.noExportables=Aucun point sélectionné pour l’exploitation watchlist.imageChartLiveButton=Démarrer/Arrêter graphique en direct script.execute.success=Exécuté avec succès script.execute.error=Erreur @@ -3148,7 +3148,7 @@ menu.compound_event_detectors.tooltip=Détecteurs d'évènement composés menu.point_links.tooltip=Liens de points menu.scripting.tooltip=Scénario menu.users.tooltip=Utilisateurs -menu.users_profiles.tooltip=Profils d'utilisateurs +menu.users_profiles.tooltip=Profils d’utilisateurs menu.point_hierarchy.tooltip=Hiérarchies des points menu.mailing_lists.tooltip=Listes des diffusions menu.publishers.tooltip=Editeurs @@ -3166,12 +3166,12 @@ menu.point_hierarchy.delete.tooltip=Supprimer dossier / Déplacer le point à la menu.point_hierarchy.refresh.tooltip=Rafraîchir menu.point_hierarchy.info.tooltip=Information ds.state.migrationOrErrorSerializeChangeEnableState=Pendant la lecture des données/migration/erreur sur le statut on/off des sources de données a été modifié -ds.state.stopChangeEnableStateDs=En raison de la non-réponse du serveur externe et de l'arrêt des propriétés, les sources de données ont été arrêtées -ds.state.userChangeEnableStateDs=L'utilisateur a modifié le statut on/off des sources de données -ds.state.apiChangeEnableStateDs=Avec l'utilisation de l'API, le statut on/off des sources a été modifié -ds.state.importChangeEnableStateDs=Lors de l'importation, le statut on/off des sources de données a été modifié +ds.state.stopChangeEnableStateDs=En raison de la non-réponse du serveur externe et de l’arrêt des propriétés, les sources de données ont été arrêtées +ds.state.userChangeEnableStateDs=L’utilisateur a modifié le statut on/off des sources de données +ds.state.apiChangeEnableStateDs=Avec l’utilisation de l’API, le statut on/off des sources a été modifié +ds.state.importChangeEnableStateDs=Lors de l’importation, le statut on/off des sources de données a été modifié ds.state.scryptChangeEnable=Le script a changé le statut on/off des sources de données -ds.state.userCpChangeEnableStateDs=L'utilisateur a copié les sources de données. Les sources de données sont désactivées par défaut +ds.state.userCpChangeEnableStateDs=L’utilisateur a copié les sources de données. Les sources de données sont désactivées par défaut dsList.statusDescribe=Description du statut event.reactivation.sleep=Les sources de données ont été mises en sommeil event.ds.describe={1} @@ -3333,4 +3333,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor +pointEdit.buttons.note.prefix=Note: +sql.warning.prefix=Attention: +views.noViews.prefix=maintenant. annotation.api=REST API +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/messages_lu.properties b/test/messages_lu.properties index 0edef65f88..d46be3fc4d 100644 --- a/test/messages_lu.properties +++ b/test/messages_lu.properties @@ -775,7 +775,7 @@ dsEdit.mbus.vifeLabel=Vifes dsEdit.mbus.vifeLabels=Vife Label dsEdit.mbus.vifeTypes=Vife Typen dsEdit.meta=Meta Datenquell -dsEdit.meta.delay=Berechnungsverz\u00f6gerung
+dsEdit.meta.delay=Berechnungsverz\u00f6gerung dsEdit.meta.desc=Meta Datenquell Konfiguratioun dsEdit.meta.event=Aktualis\u00e9ierungsereegnis dsEdit.meta.event.context=\u00c4nnerung vun den Agangsvariablen @@ -1179,8 +1179,8 @@ dsEdit.validate.required=Required value dsEdit.viconics=Viconics Wireless Thermostats dsEdit.viconics.channel=Channel dsEdit.viconics.chipRevision=Chip revision -dsEdit.viconics.chipRevisionBr=Chip
revision -dsEdit.viconics.commAddress=Comm
address +dsEdit.viconics.chipRevisionBr=Chip revision +dsEdit.viconics.commAddress=Comm address dsEdit.viconics.convertCelsius=Convert temperatures to celsius dsEdit.viconics.crss=CRSS dsEdit.viconics.dataSourceNotStarted=Data source is not started @@ -1189,9 +1189,9 @@ dsEdit.viconics.deviceRemove=Device remove (s) dsEdit.viconics.deviceWarning=Device offline timeone (s) dsEdit.viconics.devices=Devices dsEdit.viconics.dpconn=Port: {0}, PAN ID: {1}, Channel: {2} -dsEdit.viconics.firmwareRevision=Firmware
revision +dsEdit.viconics.firmwareRevision=Firmware revision dsEdit.viconics.ieee=IEEE -dsEdit.viconics.modelNumber=Model
number +dsEdit.viconics.modelNumber=Model number dsEdit.viconics.networkIdentifyFailure=Network identify failed: {0} dsEdit.viconics.networkInfo=Network information dsEdit.viconics.networkTimeout=Network offline timeout (s) @@ -1205,9 +1205,9 @@ dsEdit.viconics.timeout=Message timeout dsEdit.viconics.trss=TRSS dsEdit.viconics.unreliable=Point value may not be reliable dsEdit.viconics.zigbeeFirmwareRevision=Zigbee firmware revision -dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee
firmware
revision +dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee firmware revision dsEdit.viconics.zigbeeNetworkAddress=Zigbee network address -dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee
network
address +dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee network address dsEdit.virtual=Virtuell Datenquell dsEdit.virtual.attractionPoint=Datenpunkt Attraktor dsEdit.virtual.change=\u00c4nnerung @@ -1273,17 +1273,17 @@ dsedit.opc.tagName=Tag Tag emport.added=added emport.causedBy=caused by: emport.compoundEvent.prefix=Compound event detector ''{0}'': {1} -emport.compoundEvent.xid=A compound event detector does not have an 'xid' value. Ignored. +emport.compoundEvent.xid=A compound event detector does not have an ’xid’ value. Ignored. emport.confirmImport=Warn: the current database will be erased! Are you sure you want to import a new project? emport.data=Daten emport.dataPoint.badReference=Data point with XID ''{0}'' does not already exist and references a data source that does not exist. Ignored. emport.dataPoint.prefix=Data point ''{0}'': {1} -emport.dataPoint.xid=A data point with name ''{0}'' does not have an 'xid' value. Ignored. +emport.dataPoint.xid=A data point with name ''{0}'' does not have an ’xid’ value. Ignored. emport.dataPoints=Datenpunkten -emport.dataSource.invalidType=Data source with XID ''{0}'' does not already exist and has an invalid 'type' value of ''{1}''. Valid types are {2} -emport.dataSource.missingType=Data source with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} +emport.dataSource.invalidType=Data source with XID ''{0}'' does not already exist and has an invalid ’type’ value of ''{1}''. Valid types are {2} +emport.dataSource.missingType=Data source with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} emport.dataSource.prefix=Datenquell ''{0}'' : {1} -emport.dataSource.xid=A data source with name ''{0}'' does not have an 'xid' value. Ignored. +emport.dataSource.xid=A data source with name ''{0}'' does not have an ’xid’ value. Ignored. emport.error.alarmLevel=Invalid alarm level ''{0}'' for event ''{1}''. Valid values are {2} emport.error.attractor.missingPoint=Data point with ''{0}'' XID ''{1}'' not found emport.error.chart.invalid=Chart renderer has an invalid ''{0}'' value of ''{1}''. Valid values are {2} @@ -1291,7 +1291,7 @@ emport.error.chart.missing=Chart renderer must have a ''{0}''. Valid values are emport.error.component.imageChart.invalid=Image chart component has an invalid ''{0}'' value of ''{1}''. Valid values are {2} emport.error.component.imageChart.missing=Image chart component must have a ''{0}''. Valid values are {1} emport.error.component.imageIndex=Image index {0} is too high for image set ''{1}''. Valid values are 0 to {2} -emport.error.component.incompatibleDataType=Data point with 'XID' ''{0}'' has a data type that is not compatible with view component type ''{1}'' +emport.error.component.incompatibleDataType=Data point with ’XID’ ''{0}'' has a data type that is not compatible with view component type ''{1}'' emport.error.component.invalid=View component has an invalid ''{0}'' value of ''{1}''. Valid values are {2} emport.error.component.missing=View component must have a ''{0}''. Valid values are {1} emport.error.component.unknownDynamicImage=Dynamic image id ''{0}'' not found. Known dynamic image ids are {1} @@ -1330,7 +1330,7 @@ emport.error.text.missing=Text renderer must have a ''{0}''. Valid values are {1 emport.error.viewShare.missing=Missing ''{0}'' in view share emport.errorMessage=Errors: emport.eventHandler.prefix=Point link ''{0}'': {1} -emport.eventHandler.xid=A point link does not have an 'xid' value. Ignored. +emport.eventHandler.xid=A point link does not have an ’xid’ value. Ignored. emport.export=Export emport.exportDate=Export date emport.exportJson=Generate JSON @@ -1353,29 +1353,29 @@ emport.importProjectTitle=Import Project (Upload) emport.includePointValues=Include point values emport.indent=Ar\u00e9ckung emport.invalidFile=File reading failed ({0}) -emport.invalidImportData=Fir ze import\u00e9ierend Daten sinn ong\u00fclteg: keen JSON objet. +emport.invalidImportData=Fir ze import\u00e9ierend Daten sinn ong\u00fclteg: keen JSON objet. (www.json.org) emport.invalidProjectName=Invalid name emport.mailingList.prefix=Mailing list ''{0}'': {1} -emport.mailingList.xid=A mailing list does not have an 'xid' value. Ignored. +emport.mailingList.xid=A mailing list does not have an ’xid’ value. Ignored. emport.maintenanceEvent.prefix=Maintenance event ''{0}'': {1} -emport.maintenanceEvent.xid=A maintenance event does not have an 'xid' value. Ignored. +emport.maintenanceEvent.xid=A maintenance event does not have an ’xid’ value. Ignored. emport.noMessages=No result message. Nothing to import? emport.parseError=JSON-Parser Fehler: {0} emport.pointHierarchy.prefix=Datenpunkthierarchie: {0} emport.pointLink.prefix=Point link ''{0}'': {1} -emport.pointLink.xid=A point link does not have an 'xid' value. Ignored. +emport.pointLink.xid=A point link does not have an ’xid’ value. Ignored. emport.pointValue.missingPoint=Point value ''{0}'': Data point not found emport.pointValues=Point values emport.pointValuesMax= Max point values emport.projectDescription=Description emport.projectName=Project name -emport.publisher.invalidType=Publisher with XID ''{0}'' does not already exist and has an invalid 'type' value of ''{1}''. Valid types are {2} -emport.publisher.missingType=Publisher with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} +emport.publisher.invalidType=Publisher with XID ''{0}'' does not already exist and has an invalid ’type’ value of ''{1}''. Valid types are {2} +emport.publisher.missingType=Publisher with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} emport.publisher.prefix=Publisher ''{0}'': {1} -emport.publisher.xid=A data source with name ''{0}'' does not have an 'xid' value. Ignored. +emport.publisher.xid=A data source with name ''{0}'' does not have an ’xid’ value. Ignored. emport.saved=gesp\u00e4ichert emport.scheduledEvent.prefix=Scheduled event ''{0}'': {1} -emport.scheduledEvent.xid=A scheduled event does not have an 'xid' value. Ignored. +emport.scheduledEvent.xid=A scheduled event does not have an ’xid’ value. Ignored. emport.script.prefix=Script ''{0}'': {1} emport.select=Mark\u00e9iert, wat Dir export\u00e9ieren w\u00ebllt emport.selectAll=alles mark\u00e9ieren @@ -1386,14 +1386,14 @@ emport.unselectAll=all Mark\u00e9ierungen l\u00f6schen emport.uploadError=Upload failed ({0}) emport.uploadsFolder=Include Uploads folder emport.user.prefix=Benotzer ''{0} : {1} -emport.user.username=A user does not have a 'username' value. Ignored. +emport.user.username=A user does not have a ’username’ value. Ignored. emport.userPermission.prefix=Recte fir Benotzer ''{0}'' : {1} -emport.versionError=The project version ({0}) isn't compatible with current system version ({1}) -emport.view.missingType=View with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} +emport.versionError=The project version ({0}) isn’t compatible with current system version ({1}) +emport.view.missingType=View with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} emport.view.prefix=Prozessbild ''{0}'' : {1} -emport.view.xid=A graphical view does not have an 'xid' value. Ignored. +emport.view.xid=A graphical view does not have an ’xid’ value. Ignored. emport.watchList.prefix=Watch list ''{0}'': {1} -emport.watchList.xid=A watch list does not have an 'xid' value. Ignored. +emport.watchList.xid=A watch list does not have an ’xid’ value. Ignored. engUnit.0=square meters engUnit.1=square feet engUnit.10=megavolt amperes @@ -1586,8 +1586,8 @@ engUnit.98=percent engUnit.99=percent per second engUnit.190=kilometers engUnit.abbr.190=km -engUnit.abbr.0=m2 -engUnit.abbr.1=f2 +engUnit.abbr.0=m\u00b2 +engUnit.abbr.1=ft\u00b2 engUnit.abbr.10=megavolt amperes engUnit.abbr.100=per minute engUnit.abbr.101=per second @@ -1808,7 +1808,7 @@ event.alarmMaxDecreased=H\u00e9chsten Alarmpriorit\u00e9it huet sech vun {0} op event.alarmMaxIncreased=H\u00e9chsten Alarmpriorit\u00e9it huet sech vun {0} op {1} erh\u00e9icht event.audit.added=Benotzer "{0}" huet {1} mat id {2}: {3} erzeugt event.audit.changed=Benotzer "{0}" huet {1} mat id {2}: {3} ge\u00e4nnert -event.audit.changedProperty=
    {0}: "{1}" zu "{2}" +event.audit.changedProperty={0}: "{1}" zu "{2}" event.audit.compoundEventDetector=Compound event detector event.audit.dataPoint=Datenpunkt event.audit.dataSource=Datenquell @@ -1817,7 +1817,7 @@ event.audit.eventHandler=Event handler event.audit.maintenanceEvent=Maintenance event event.audit.pointEventDetector=Point event detector event.audit.pointLink=Point link -event.audit.property=
    {0}="{1}" +event.audit.property={0}="{1}" event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2072,8 +2072,8 @@ event.valueParse.generalParsePoint={0}, result={1}, point={2} event.valueParse.noData=No data to match against for point {0} event.valueParse.noTime=No time match made {0} event.valueParse.noValue=No value match made for point {0} -event.valueParse.numericParse=Couldn't parse to numeric, result={0} -event.valueParse.numericParsePoint=Couldn't parse to numeric, result={0}, point={1} +event.valueParse.numericParse=Couldn’t parse to numeric, result={0} +event.valueParse.numericParsePoint=Couldn’t parse to numeric, result={0}, point={1} event.valueParse.textParse=Value did not match any multistate text and was not parsable, result={0} event.valueParse.textParsePoint=Value did not match any multistate text and was not parsable, result={0}, point={1} event.valueParse.timeParse=Failed to parse time "{0}" @@ -2112,7 +2112,7 @@ eventHandlers.inactiveNotif=Benoriichtegung gaang eventHandlers.inactiveOverride=Override inactive recipients eventHandlers.inactiveRecipients=Inactive recipients eventHandlers.inactiveScript=When inactive script -eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler's inactive list +eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler’s inactive list eventHandlers.invalidActiveSource=Invalid active source point eventHandlers.invalidActiveSourceType=Invalid active source point data type eventHandlers.invalidActiveValue=Invalid active value to set @@ -2122,14 +2122,14 @@ eventHandlers.invalidInactiveSourceType=Invalid inactive source point data type eventHandlers.invalidInactiveValue=Invalid inactive value to set eventHandlers.invalidScripts=Selecione ao menos um script eventHandlers.maintenanceEvents=Maintenance events -eventHandlers.noEmailRecips=Keen Email Empf\u00e4nger!
Dir musst mindestens een Email Empf\u00e4nger b\u00e4if\u00fcgen -eventHandlers.noEscalRecips=Keng Eskalatiouns Email Empf\u00e4nger!
Dir musst mindestens een Eskalatiouns Email Empf\u00e4nger b\u00e4if\u00fcgen +eventHandlers.noEmailRecips=Keen Email Empf\u00e4nger! Dir musst mindestens een Email Empf\u00e4nger b\u00e4if\u00fcgen +eventHandlers.noEscalRecips=Keng Eskalatiouns Email Empf\u00e4nger! Dir musst mindestens een Eskalatiouns Email Empf\u00e4nger b\u00e4if\u00fcgen eventHandlers.noInactiveRecips=You must add inactive recipients eventHandlers.noSetPointAction=No set point action has been defined eventHandlers.noTargetPoint=No target point selected. You may not have any settable points defined. eventHandlers.pointEventDetector=Datenpunktereegnisser eventHandlers.publisherEvents=Ereegnisser Ver\u00f6ffentlechung -eventHandlers.recipTestEmailMessage=This message was sent as a test of an event handler's email recipient list +eventHandlers.recipTestEmailMessage=This message was sent as a test of an event handler’s email recipient list eventHandlers.recipientType.active=Active eventHandlers.recipientType.escalation=Escalation eventHandlers.recipientType.inactive=Inactive @@ -2348,7 +2348,7 @@ login.nag=Hiweis: et ass m\u00e9iglech dat Dir Problemer mat ScadaLTS hutt, well login.password=Passwuert login.supportedBrowser=D\u00ebse Browser g\u00ebtt \u00ebnnerst\u00ebtzt login.unknownBrowser=Onbekannte Browser -login.unsupportedBrowser=D\u00ebse Browser g\u00ebtt offiziell net vun Serotonin Software \u00ebnnerst\u00ebtzt. Mir empfielen Firefox, Chrome, oder Internet Explorer 7. +login.unsupportedBrowser=D\u00ebse Browser g\u00ebtt offiziell net vun Serotonin Software \u00ebnnerst\u00ebtzt. Mir empfielen Mozilla Firefox, Google Chrome. login.userId=Benotzernumm login.validation.accountDisabled=\u00c4ren Account gouf gespaart, wennt Iech w.e.g un \u00c4ren Administrator login.validation.invalidLogin=Login gescheitert, bitte prob\u00e9iert et nach eng K\u00e9ier @@ -2421,7 +2421,7 @@ notes.timeByUsername=Z\u00e4itstempel an Benotzer notes.userNotes=Bemierkungen notification.newui.title=New page is available! notification.newui.move=Move! -notification.newui.dontshow=Don't show again. +notification.newui.dontshow=Don’t show again. pagination.ascending=Opsteigend pagination.descending=Ofsteigend pagination.next=N\u00e4chst(en) @@ -2466,7 +2466,7 @@ pointDetails.username=Benotzernumm pointDetails.views=Usichten pointEdit.buttons.disable=Ausschalten pointEdit.buttons.enable=Aschalten -pointEdit.buttons.note=Hinweis: sp\u00e4icheren, deaktiv\u00e9ieren oder nei starten setzen all aktiven Ereegnisse zer\u00e9ck. +pointEdit.buttons.note=sp\u00e4icheren, deaktiv\u00e9ieren oder nei starten setzen all aktiven Ereegnisse zer\u00e9ck. pointEdit.buttons.restart=Neistart pointEdit.chart.includeSum=Zomm berechnen pointEdit.chart.invalidLimit=Tabell: Unzuel muss zw\u00ebschen 2 an 50 leien @@ -2615,7 +2615,7 @@ pointHierarchySLTS.dataSource=Data source pointHierarchySLTS.xid=XID pointHierarchySLTS.type=Type pointHierarchySLTS.changeOfLanguageFailed=Change of language failed -pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don't remove data point in root hierarchy +pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don’t remove data point in root hierarchy pointHierarchySLTS.moveDataPointToRoot=Move the element to root level tree pointHierarchySLTS.areYouSureToMoveElement=Are you sure to move element? pointHierarchySLTS.movedElement=Moved element @@ -2777,7 +2777,7 @@ reports.pointComments=Point comments reports.pointComments.empty=No point comments to list reports.pointName=Numm reports.previous=Vorherige(r) -reports.recipTestEmailMessage=This message was sent as a test of a report's email recipient list +reports.recipTestEmailMessage=This message was sent as a test of a report’s email recipient list reports.relative=Relativ zur Erstellungsz\u00e4it reports.rendered=Erstellt reports.report=Report @@ -2856,7 +2856,7 @@ sql.query=SQL-Offro starten sql.rowsUpdated=Datens\u00e4tz aktualis\u00e9iert sql.sql=SQL sql.update=SQL-Update ausf\u00e9ieren -sql.warning=Achtung: Benotzt d’SQL Offro mat Virsiicht. Benotzerfehler kennen zu Datenverloscht an/oder Fehlfunktiounen vum System f\u00e9ieren.. +sql.warning=Benotzt d'SQL Offro mat Virsiicht. Benotzerfehler kennen zu Datenverloscht an/oder Fehlfunktiounen vum System f\u00e9ieren. systemSettings.auditAlarmLevels=Audit event alarm levels systemSettings.auditAlarmLevelsSaved=Audit event alarm levels have been saved systemSettings.auth=Server erfuerdert Legitimatioun @@ -3058,7 +3058,7 @@ viewEdit.compound.type.static=Static viewEdit.compound.width=Breet viewEdit.deletePointView=Delete point component viewEdit.deleteStaticView=Delete static content -viewEdit.deleteView=Remove yourself from the view's share list +viewEdit.deleteView=Remove yourself from the view’s share list viewEdit.editGraphicalRenderer=Beaarbecht Duerstellung viewEdit.editPointView=Beaarbecht Datenpunkt vum Bausteen viewEdit.editStaticView=Edit static content @@ -3129,7 +3129,7 @@ viewEdit.viewDelete=Delete view: viewEdit.viewDeleteConfirm=Confirm viedEdit.viewSize=Size views.newView=Nei Prozessusicht -views.noViews=Dir hutt nach kee Prozessbild. Erstellt een jetzt . +views.noViews=Dir hutt nach kee Prozessbild. Erstellt een views.title=Prozessbild watchlist.addNewList=Nei Beobachtungslescht watchlist.addToWatchlist=Zur Beobachtungslescht b\u00e4if\u00fcgen @@ -3352,4 +3352,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor annotation.api=REST API +pointEdit.buttons.note.prefix=Hinweis: +sql.warning.prefix=Warnung: +views.noViews.prefix=elo. +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/messages_nl.properties b/test/messages_nl.properties index 1c89e4648a..b88d94b018 100644 --- a/test/messages_nl.properties +++ b/test/messages_nl.properties @@ -665,7 +665,7 @@ dsEdit.meta.event.week=Start van week dsEdit.meta.event.month=Start van maand dsEdit.meta.event.year=Start van jaar dsEdit.meta.event.cron=Cron patroon -dsEdit.meta.delay=Uitvoering vertraging
+dsEdit.meta.delay=Uitvoering vertraging dsEdit.meta.test.success=Succes. resultaat={0} dsEdit.meta.test.successTs=Success. resultaat={0}, tijdstempel={1} dsEdit.meta.test.context=Een of meer punten zijn uitgeschakeld of missen @@ -947,16 +947,16 @@ dsEdit.viconics.networkInfo=Netwerk informatie dsEdit.viconics.refreshing=Verversen... dsEdit.viconics.rfModule=RF Module dsEdit.viconics.devices=Devices -dsEdit.viconics.commAddress=Comm
adres -dsEdit.viconics.modelNumber=Model
nummer -dsEdit.viconics.firmwareRevision=Firmware
revisie +dsEdit.viconics.commAddress=Comm adres +dsEdit.viconics.modelNumber=Model nummer +dsEdit.viconics.firmwareRevision=Firmware revisie dsEdit.viconics.zigbeeFirmwareRevision=Zigbee firmware revisie -dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee
firmware
revisie +dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee firmware revisie dsEdit.viconics.zigbeeNetworkAddress=Zigbee netwerk adres -dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee
netwerk
adres +dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee netwerk adres dsEdit.viconics.ieee=IEEE dsEdit.viconics.chipRevision=Chip revisie -dsEdit.viconics.chipRevisionBr=Chip
revisie +dsEdit.viconics.chipRevisionBr=Chip revisie dsEdit.viconics.trss=TRSS dsEdit.viconics.crss=CRSS @@ -1075,38 +1075,38 @@ emport.importProgress=Bezig met importeren... emport.importCancelled=Import afgebroken emport.importComplete=Import gereed emport.noMessages=Geen resultaat bericht. Niets te importeren ? -emport.invalidImportData=Import data is ongeldig: geen JSON object +emport.invalidImportData=Import data is ongeldig: geen JSON object. (www.json.org) emport.parseError=JSON parse fout: {0} -emport.user.username=Een gebruiker heeft geen 'gebruiker' waarde. Genegeerd. +emport.user.username=Een gebruiker heeft geen ’gebruiker’ waarde. Genegeerd. emport.user.prefix=Gebruiker ''{0}'': {1} -emport.view.missingType=View met XID ''{0}'' bestaat nog niet en heeft geen 'type' waarde. Geldige typen zijn {1} -emport.dataSource.xid=Een gegevensbron met naam ''{0}'' heeft geen 'xid' waarde. Genegeerd. -emport.dataSource.missingType=gegevensbron met XID ''{0}'' bestaat nog niet en heeft geen 'type' waarde. Geldige typen zijn {1} -emport.dataSource.invalidType="gegevensbron met XID ''{0}'' bestaat nog niet en heeft een ongeldige 'type' waarde van ''{1}''. Geldige typen zijn {2} +emport.view.missingType=View met XID ''{0}'' bestaat nog niet en heeft geen ’type’ waarde. Geldige typen zijn {1} +emport.dataSource.xid=Een gegevensbron met naam ''{0}'' heeft geen ’xid’ waarde. Genegeerd. +emport.dataSource.missingType=gegevensbron met XID ''{0}'' bestaat nog niet en heeft geen ’type’ waarde. Geldige typen zijn {1} +emport.dataSource.invalidType="gegevensbron met XID ''{0}'' bestaat nog niet en heeft een ongeldige ’type’ waarde van ''{1}''. Geldige typen zijn {2} emport.dataSource.prefix=gegevensbron ''{0}'': {1} -emport.dataPoint.xid=A data punt met naam ''{0}'' heeft geen 'xid' waarde. Genegeerd. +emport.dataPoint.xid=A data punt met naam ''{0}'' heeft geen ’xid’ waarde. Genegeerd. emport.dataPoint.badReference=Data punt met XID ''{0}'' bestaat nog niet en refereert naar een gegevensbron die nog niet bestaat. Genegeerd. emport.dataPoint.prefix=Data punt ''{0}'': {1} emport.userPermission.prefix=Rechten voor gebruiker ''{0}'': {1} emport.added=toegevoegd emport.saved=opgeslagen emport.causedBy=veroorzaakt door: -emport.view.xid=Een grafische view heeft geen 'xid' waarde. Genegeerd. +emport.view.xid=Een grafische view heeft geen ’xid’ waarde. Genegeerd. emport.view.prefix=View ''{0}'': {1} emport.pointHierarchy.prefix=Punt hiërarchie: {0} -emport.pointLink.xid=Een punt link heeft geen 'xid' waarde. Genegeerd. +emport.pointLink.xid=Een punt link heeft geen ’xid’ waarde. Genegeerd. emport.pointLink.prefix=Punt link ''{0}'': {1} -emport.scheduledEvent.xid=Een geplande gebeurtenis heeft geen 'xid' waarde. Genegeerd. +emport.scheduledEvent.xid=Een geplande gebeurtenis heeft geen ’xid’ waarde. Genegeerd. emport.scheduledEvent.prefix=Geplande gebeurtenis ''{0}'': {1} -emport.compoundEvent.xid=Een samengestelde gebeurtenis detector heeft geen 'xid' waarde. Genegeerd. +emport.compoundEvent.xid=Een samengestelde gebeurtenis detector heeft geen ’xid’ waarde. Genegeerd. emport.compoundEvent.prefix=Samengestelde gebeurtenis detector ''{0}'': {1} -emport.mailingList.xid=Een mailing lijst heeft geen 'xid' waarde. Genegeerd. +emport.mailingList.xid=Een mailing lijst heeft geen ’xid’ waarde. Genegeerd. emport.mailingList.prefix=Mailing lijst ''{0}'': {1} -emport.eventHandler.xid=Een punt link heeft geen 'xid' waarde. Genegeerd. +emport.eventHandler.xid=Een punt link heeft geen ’xid’ waarde. Genegeerd. emport.eventHandler.prefix=Punt link ''{0}'': {1} -emport.publisher.xid=Een data bron met naam ''{0}'' heeft geen 'xid' waarde. 'xid' value. Genegeerd. -emport.publisher.missingType=Publisher met XID ''{0}'' bestaat nog niet en heeft geen 'type' waarde. Geldige types zijn {1} -emport.publisher.invalidType=Publisher met XID ''{0}'' bestaat nog niet en heeft geen geldige 'type' waarde. 'type' waarde van ''{1}''. Geldige types zijn {2} +emport.publisher.xid=Een data bron met naam ''{0}'' heeft geen ’xid’ waarde. ’xid’ value. Genegeerd. +emport.publisher.missingType=Publisher met XID ''{0}'' bestaat nog niet en heeft geen ’type’ waarde. Geldige types zijn {1} +emport.publisher.invalidType=Publisher met XID ''{0}'' bestaat nog niet en heeft geen geldige ’type’ waarde. ’type’ waarde van ''{1}''. Geldige types zijn {2} emport.publisher.prefix=Publisher ''{0}'': {1} eventHandlers.recipTestEmailMessage=Dit bericht was verzonden om een email ontangstlijst van een gebeurtenis afhandelaar te testen @@ -1228,8 +1228,7 @@ login.loginButton=Inloggen login.unknownBrowser=Bezig met controleren browser voor compatibiliteit... login.supportedBrowser=Deze browser is ondersteund. login.unsupportedBrowser=Het kan zijn dat uw browser wel werkt met dit product, maar het is niet officieel ondersteund door Serotonin \ -Software. Wij adviseren het gebruik van Firefox, Chrome, of \ -Internet Explorer 7. +Software. Wij adviseren het gebruik van Mozilla Firefox, Google Chrome. login.nag=NB: Het kan zijn dat u problemen ondervindt met ScadaLTS omdat uw browser niet officieel is ondersteund. Upgrade uw browser s.v.p. mailingLists.added=Mailing lijst toegevoegd @@ -1261,7 +1260,7 @@ notes.cancel=Afbreken notes.timeByUsername=tijd door gebruikersnaam notification.newui.title=New page is available! notification.newui.move=Move! -notification.newui.dontshow=Don't show again. +notification.newui.dontshow=Don’t show again. pointDetails.recordCountError=Record teller moet een getal zijn pointDetails.timePeriodError=Tijd periode moet een getal zijn pointDetails.imageCountError=Afbeelding teller moet een getal zijn @@ -1297,7 +1296,7 @@ pointDetails.accessType=Toegangstype pointEdit.buttons.enable=Inschakelen pointEdit.buttons.disable=Uitschakelen pointEdit.buttons.restart=Herstart -pointEdit.buttons.note=Noot: opslaan, uitschakelen, of herstarten van een punt heeft tot gevolg dat alle actieve gebeurtenissen terugkeren naar normaal. +pointEdit.buttons.note=opslaan, uitschakelen, of herstarten van een punt heeft tot gevolg dat alle actieve gebeurtenissen terugkeren naar normaal. pointEdit.chart.props=Grafiek generator eigenschappen pointEdit.chart.type=Type @@ -1450,7 +1449,7 @@ pointHierarchySLTS.dataSource=Data source pointHierarchySLTS.xid=XID pointHierarchySLTS.type=Type pointHierarchySLTS.changeOfLanguageFailed=Change of language failed -pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don't remove data point in root hierarchy +pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don’t remove data point in root hierarchy pointHierarchySLTS.moveDataPointToRoot=Move the element to root level tree pointHierarchySLTS.areYouSureToMoveElement=Are you sure to move element? pointHierarchySLTS.movedElement=Moved element @@ -1647,7 +1646,7 @@ scheduledEvents.validate.inactiveTrigger=Fout bij aanmaken inactieve trigger: {0 scheduledEvents.validate.aliasTooLong=Alias kan niet langer zijn dan 50 karakters scheduledEvents.validate.invalidRtn=Inactief tijd moet na actief tijd komen -sql.warning=Waarschuwing: gebruik deze faciliteit op eigen risico. Incorrect gebruik kan leiden tot beschadigde data en/of systeem storing. +sql.warning=gebruik deze faciliteit op eigen risico. Incorrect gebruik kan leiden tot beschadigde data en/of systeem storing. sql.sql=SQL sql.query=Invoeren query sql.update=Invoeren update @@ -1665,8 +1664,8 @@ systemSettings.upToDate=Deze instantie van Mango is up to date systemSettings.emailSettings=Email instellingen systemSettings.smtpHost=SMTP host systemSettings.smtpPort=SMTP poort -systemSettings.fromAddress='Van' adres -systemSettings.fromName='Van' naam +systemSettings.fromAddress=’Van’ adres +systemSettings.fromName=’Van’ naam systemSettings.auth=Gebruik autorisatie systemSettings.smtpUsername=Gebruikersnaam systemSettings.smtpPassword=Wachtwoord @@ -1816,7 +1815,7 @@ viewEdit.compound.duration=Duur views.title=Grafische views views.newView=Nieuwe view -views.noViews=Er zijn nog geen grafische views aangemaakt. Maak er nu een aan. +views.noViews=Er zijn nog geen grafische views aangemaakt. Maak er viewEdit.viewDelete=Delete view: viewEdit.viewDeleteConfirm=Confirm @@ -1918,7 +1917,7 @@ event.system.process=Proces gebeurtenis handler gefaald event.audit.added=User "{0}" aangemaakt {1} met id {2}: {3} event.audit.changed=User "{0}" veranderd {1} met id {2}: {3} -event.audit.changedProperty=
    {0}: "{1}" to "{2}" +event.audit.changedProperty={0}: "{1}" to "{2}" event.audit.compoundEventDetector=Samengestelde gebeurtenis detector event.audit.dataPoint=Data punt event.audit.dataSource=Data bron @@ -1927,7 +1926,7 @@ event.audit.eventHandler=Gebeurtenis handler event.audit.maintenanceEvent=Maintenance event event.audit.pointEventDetector=Punt gebeurtenis detector event.audit.pointLink=Punt link -event.audit.property=
    {0}="{1}" +event.audit.property={0}="{1}" event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2267,7 +2266,7 @@ emport.error.eventCode=Ongeldige gebeurtenis code ''{0}''. Geldig codes zijn {1} emport.error.alarmLevel=Ongeldig alarm niveau ''{0}'' voor gebeurtenis ''{1}''. Geldige waarden zijn {2} emport.error.missingUser=Gebruiker met gebruikersnaam ''{0}'' niet gevonden emport.error.viewShare.missing=Ontbrekende ''{0}'' in gedeelde view -emport.error.component.incompatibleDataType=Data punt met 'XID' ''{0}'' heeft een data type die niet compatibel is met view component type ''{1}'' +emport.error.component.incompatibleDataType=Data punt met ’XID’ ''{0}'' heeft een data type die niet compatibel is met view component type ''{1}'' emport.error.compound.invalidChildId=Ongeldig child id ''{0}'' voor samengestelde view component van type ''{1}''. Geldige ids zijn {2} emport.error.component.unknownDynamicImage=Dynamische afbeelding id ''{0}'' niet gevonden. Bekende dynamische afbeelding ids zijn {1} emport.error.component.unknownImageSet=Afbeelding set id ''{0}'' niet gevonden. Bekende afbeelding set ids zijn {1} @@ -2482,8 +2481,8 @@ engUnit.188=newton per meter engUnit.189=watt per meter per graden kelvin engUnit.190=kilometers -engUnit.abbr.0=m2 -engUnit.abbr.1=f2 +engUnit.abbr.0=m\u00b2 +engUnit.abbr.1=ft\u00b2 engUnit.abbr.2=mA engUnit.abbr.3=A engUnit.abbr.4=ohms @@ -2889,7 +2888,7 @@ emport.exportProjectInstruction=Select your options and download the project fil pointEdit.props.chartColour=Chart color eventHandlers.activeScript=When active script dox.drStorageHt5bDS=Data Source Dr.StorageHT-5B -eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler's inactive list +eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler’s inactive list dox.colours=Color emport.projectName=Project name dsEdit.fhz4j.deviceHousecode=Device Housecode @@ -2961,7 +2960,7 @@ dsEdit.jmx.writeFailed=Write failed for ''{0}'' viewEdit.graphic.views=Views dsEdit.asciiSerial.desc=ASCII Serial Properties graphic.enhancedImageChart.seriesConfig.seriesOptions.strokeWidth=Stroke width\: -emport.watchList.xid=A watch list does not have an 'xid' value. Ignored. +emport.watchList.xid=A watch list does not have an ’xid’ value. Ignored. reports.zipData=Data in .zip format events.silenceAll=Silence all viewEdit.graphic.whenOffLabel=Label when OFF (0, false) @@ -2969,7 +2968,7 @@ viewEdit.graphic.text=Text script.dpCommands=Datapoints commands dsEdit.asciiSerial.stopMode=Stop mode dsEdit.nodaves7.writeBaseCmd=Write command line -emport.versionError=The project version ({0}) isn't compatible with current system version ({1}) +emport.versionError=The project version ({0}) is’ compatible with current system version ({1}) events.export.ackedByDeletedUser=(user deleted) dsEdit.jmx.attributeName=Attribute name dsEdit.opc.tagName=Tag Name @@ -3183,7 +3182,7 @@ publisherEdit.persistent.status.connecting=Connected point {0} of {1} emport.systemSettingsFailed=System configuration export error dsEdit.serial.inputBufferSize=Input Buffer Size viewEdit.compound.type.static=Static -emport.maintenanceEvent.xid=A maintenance event does not have an 'xid' value. Ignored. +emport.maintenanceEvent.xid=A maintenance event does not have an ’xid’ value. Ignored. dsEdit.modbusIp.socketPointName=TCP socket monitoring scripts.seDetails=Script details watchlist.consolidatedChart=Include in consolidated chart @@ -3455,4 +3454,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor +pointEdit.buttons.note.prefix=Noot: +sql.warning.prefix=Waarschuwing: +views.noViews.prefix=nu een aan. annotation.api=REST API +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/messages_pl.properties b/test/messages_pl.properties index cedf37d94d..fe996d18cf 100644 --- a/test/messages_pl.properties +++ b/test/messages_pl.properties @@ -195,7 +195,7 @@ js.help.error=B\u0142\u0105d js.help.related=Powi\u0105zane przedmioty js.help.lastUpdated=Ostatnio zaktualizowany js.email.noRecipients=Brak odbiorc\u00f3w -js.email.addMailingList=Dodaj list\u0119 mail'ingow\u0105 +js.email.addMailingList=Dodaj list\u0119 mail’ingow\u0105 js.email.addUser=Dodaj u\u017cytkownika js.email.addAddress=Dodaj adres js.email.noRecipForEmail=Brak odbiorc\u00f3w do wys\u0142ania testowego e-maila @@ -679,7 +679,7 @@ dsEdit.meta.event.week=Start of week dsEdit.meta.event.month=Start of month dsEdit.meta.event.year=Start of year dsEdit.meta.event.cron=Cron pattern -dsEdit.meta.delay=Execution delay
+dsEdit.meta.delay=Execution delay dsEdit.meta.test.success=Success. result={0} dsEdit.meta.test.successTs=Success. result={0}, timestamp={1} dsEdit.meta.test.context=One or more points are disabled or missing @@ -761,7 +761,7 @@ dsEdit.modbusIp.transportType.udp=UDP dsEdit.modbusIp.host=Host dsEdit.modbusIp.port=Port dsEdit.modbusIp.encapsulated=Encapsulated -dsEdit.modbusIp.createSocketMonitorPoint=Stw\u00f3rz punkt monitorowania socket'u +dsEdit.modbusIp.createSocketMonitorPoint=Stw\u00f3rz punkt monitorowania socket’u dsEdit.modbusSerial=Modbus Serial dsEdit.modbusSerial.port=Port @@ -983,16 +983,16 @@ dsEdit.viconics.networkInfo=Network information dsEdit.viconics.refreshing=Refreshing... dsEdit.viconics.rfModule=RF Module dsEdit.viconics.devices=Devices -dsEdit.viconics.commAddress=Comm
address -dsEdit.viconics.modelNumber=Model
number -dsEdit.viconics.firmwareRevision=Firmware
revision +dsEdit.viconics.commAddress=Comm address +dsEdit.viconics.modelNumber=Model number +dsEdit.viconics.firmwareRevision=Firmware revision dsEdit.viconics.zigbeeFirmwareRevision=Zigbee firmware revision -dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee
firmware
revision +dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee firmware revision dsEdit.viconics.zigbeeNetworkAddress=Zigbee network address -dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee
network
address +dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee network address dsEdit.viconics.ieee=IEEE dsEdit.viconics.chipRevision=Chip revision -dsEdit.viconics.chipRevisionBr=Chip
revision +dsEdit.viconics.chipRevisionBr=Chip revision dsEdit.viconics.trss=TRSS dsEdit.viconics.crss=CRSS dsEdit.viconics.unreliable=Point value may not be reliable @@ -1135,49 +1135,49 @@ emport.importProgress=Import in progress... emport.importCancelled=Import cancelled emport.importComplete=Import complete emport.noMessages=No result message. Nothing to import? -emport.invalidImportData=Import data is invalid: not a JSON object +emport.invalidImportData=Import data is invalid: not a JSON object. (www.json.org) emport.parseError=JSON parse error: {0} -emport.user.username=A user does not have a 'username' value. Ignored. +emport.user.username=A user does not have a ’username’ value. Ignored. emport.user.prefix=User ''{0}'': {1} -emport.view.missingType=View with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} -emport.dataSource.xid=A data source with name ''{0}'' does not have an 'xid' value. Ignored. -emport.dataSource.missingType=Data source with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} -emport.dataSource.invalidType=Data source with XID ''{0}'' does not already exist and has an invalid 'type' value of ''{1}''. Valid types are {2} +emport.view.missingType=View with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} +emport.dataSource.xid=A data source with name ''{0}'' does not have an ’xid’ value. Ignored. +emport.dataSource.missingType=Data source with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} +emport.dataSource.invalidType=Data source with XID ''{0}'' does not already exist and has an invalid ’type’ value of ''{1}''. Valid types are {2} emport.dataSource.prefix=Data source ''{0}'': {1} -emport.dataPoint.xid=A data point with name ''{0}'' does not have an 'xid' value. Ignored. +emport.dataPoint.xid=A data point with name ''{0}'' does not have an ’xid’ value. Ignored. emport.dataPoint.badReference=Data point with XID ''{0}'' does not already exist and references a data source that does not exist. Ignored. emport.dataPoint.prefix=Data point ''{0}'': {1} emport.userPermission.prefix=Permissions for user ''{0}'': {1} emport.added=dodano emport.saved=zapisano emport.causedBy=przez: -emport.view.xid=A graphical view does not have an 'xid' value. Ignored. +emport.view.xid=A graphical view does not have an ’xid’ value. Ignored. emport.view.prefix=View ''{0}'': {1} emport.pointHierarchy.prefix=Point hierarchy: {0} -emport.pointLink.xid=A point link does not have an 'xid' value. Ignored. +emport.pointLink.xid=A point link does not have an ’xid’ value. Ignored. emport.pointLink.prefix=Point link ''{0}'': {1} -emport.scheduledEvent.xid=A scheduled event does not have an 'xid' value. Ignored. +emport.scheduledEvent.xid=A scheduled event does not have an ’xid’ value. Ignored. emport.scheduledEvent.prefix=Scheduled event ''{0}'': {1} -emport.compoundEvent.xid=A compound event detector does not have an 'xid' value. Ignored. +emport.compoundEvent.xid=A compound event detector does not have an ’xid’ value. Ignored. emport.compoundEvent.prefix=Compound event detector ''{0}'': {1} -emport.mailingList.xid=A mailing list does not have an 'xid' value. Ignored. +emport.mailingList.xid=A mailing list does not have an ’xid’ value. Ignored. emport.mailingList.prefix=Mailing list ''{0}'': {1} -emport.eventHandler.xid=A point link does not have an 'xid' value. Ignored. +emport.eventHandler.xid=A point link does not have an ’xid’ value. Ignored. emport.eventHandler.prefix=Point link ''{0}'': {1} -emport.publisher.xid=A data source with name ''{0}'' does not have an 'xid' value. Ignored. -emport.publisher.missingType=Publisher with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} -emport.publisher.invalidType=Publisher with XID ''{0}'' does not already exist and has an invalid 'type' value of ''{1}''. Valid types are {2} +emport.publisher.xid=A data source with name ''{0}'' does not have an ’xid’ value. Ignored. +emport.publisher.missingType=Publisher with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} +emport.publisher.invalidType=Publisher with XID ''{0}'' does not already exist and has an invalid ’type’ value of ''{1}''. Valid types are {2} emport.publisher.prefix=Publisher ''{0}'': {1} -emport.watchList.xid=A watch list does not have an 'xid' value. Ignored. +emport.watchList.xid=A watch list does not have an ’xid’ value. Ignored. emport.watchList.prefix=Watch list ''{0}'': {1} -emport.maintenanceEvent.xid=A maintenance event does not have an 'xid' value. Ignored. +emport.maintenanceEvent.xid=A maintenance event does not have an ’xid’ value. Ignored. emport.maintenanceEvent.prefix=Maintenance event ''{0}'': {1} -eventHandlers.recipTestEmailMessage=This message was sent as a test of an event handler's email recipient list +eventHandlers.recipTestEmailMessage=This message was sent as a test of an event handler’s email recipient list eventHandlers.emailRecipients=Email recipients -eventHandlers.escalTestEmailMessage=This message was sent as a test of an event handler's escalation list +eventHandlers.escalTestEmailMessage=This message was sent as a test of an event handler’s escalation list eventHandlers.escalRecipients=Escalation recipients -eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler's inactive list +eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler’s inactive list eventHandlers.inactiveRecipients=Inactive recipients eventHandlers.noEmailRecips=You must add email recipients eventHandlers.escalDelayError=Escalation delay must be greater than zero @@ -1267,7 +1267,7 @@ events.ackedByMaintenance=- maintanance mode footer.rightsReserved=Wszystkie prawa zastrze\u017cone. -header.title=ScadaJR +header.title=Scada-LTS header.mute=Wycisz header.unmute=Wy\u0142\u0105cz wyciszenie header.watchlist=Listy podgl\u0105du punkt\u00f3w @@ -1309,12 +1309,11 @@ login.validation.accountDisabled=twoje konto zosta\u0142o zablokowane. Skontaktu login.loginButton=Zaloguj login.unknownBrowser=Kontrola zgodno\u015bci przegl\u0105darki... login.supportedBrowser=Ta przegl\u0105darka jest obs\u0142ugiwana. -login.unsupportedBrowser=Twoja przegl\u0105darka mo\u017ce dzia\u0142a\u0107 poprawnie, ale nie jest oficjalnie wspierana. Rekomendujemy u\u017cywanie Firefox, Chrome, lub \ -Internet Explorer 7. +login.unsupportedBrowser=Twoja przegl\u0105darka mo\u017ce dzia\u0142a\u0107 poprawnie, ale nie jest oficjalnie wspierana. Rekomendujemy u\u017cywanie Mozilla Firefox, Google Chrome. login.nag=NOTATKA: mo\u017cesz mie\u0107 problemy poniewa\u017c u\u017cywasz nie wspieranej przegl\u0105darki. -mailingLists.added=Lista mail'ingowa dodana -mailingLists.saved=Lista mail'ingowa zapisana +mailingLists.added=Lista mail’ingowa dodana +mailingLists.saved=Lista mail’ingowa zapisana mailingLists.testEmailMessage=Test email has been sent mailingLists.noUser=No user found to add mailingLists.noAddress=Enter the email address before adding to the list @@ -1414,7 +1413,7 @@ pointDetails.accessType=Typ dost\u0119pu pointEdit.buttons.enable=Odblokuj pointEdit.buttons.disable=Zablokuj pointEdit.buttons.restart=Zrestartuj -pointEdit.buttons.note=Notatka: saving, disabling, or restarting a point causes all active events to be returned to normal. +pointEdit.buttons.note=saving, disabling, or restarting a point causes all active events to be returned to normal. pointEdit.chart.props=Chart renderer properties pointEdit.chart.type=Type @@ -1633,7 +1632,7 @@ publisherList.config=Configuration publisherList.status=status publisherList.noRows=No rows -reports.recipTestEmailMessage=This message was sent as a test of a report's email recipient list +reports.recipTestEmailMessage=This message was sent as a test of a report’s email recipient list reports.emailRecipients=Email recipients reports.export=Export data reports.eventExport=Export events @@ -1732,7 +1731,7 @@ scheduledEvents.validate.inactiveTrigger=Error creating inactive trigger: {0} scheduledEvents.validate.aliasTooLong=Alias cannot be longer than 50 characters scheduledEvents.validate.invalidRtn=Inactive time must be after active time -sql.warning=Warning: use this facility at your own risk. Incorrect usage may result in corrupted data and/or system failures. +sql.warning=use this facility at your own risk. Incorrect usage may result in corrupted data and/or system failures. sql.sql=SQL sql.query=Submit query sql.update=Submit update @@ -1750,8 +1749,8 @@ systemSettings.upToDate=This instance of Scada-LTS is up to date systemSettings.emailSettings=Ustawienia Email systemSettings.smtpHost=SMTP host systemSettings.smtpPort=SMTP port -systemSettings.fromAddress='From' address -systemSettings.fromName='From' name +systemSettings.fromAddress=’From’ address +systemSettings.fromName=’From’ name systemSettings.auth=Use authorization systemSettings.smtpUsername=Username systemSettings.smtpPassword=Password @@ -1764,7 +1763,7 @@ systemSettings.systemAlarmLevels=Poziomy alarmowe zdarze\u0144 systemowych systemSettings.auditAlarmLevels=Poziomy alarmowe punkt\u00f3w danych systemSettings.otherSettings=Inne ustawienia systemSettings.purgeEvents=Usu\u0144 zdarzenia starsze ni\u017c -systemSettings.purgeReports=PUsu\u0144 raporty starsze ni\u017c +systemSettings.purgeReports=Usu\u0144 raporty starsze ni\u017c systemSettings.uiPerformance=Wydajno\u015b\u0107 interfejsu u\u017cytkownika systemSettings.uiPerformance.high=Wysoka systemSettings.uiPerformance.med=\u015arednia @@ -1790,7 +1789,7 @@ systemSettings.purgeNow=Oczy\u015b\u0107 baz\u0119 u\u017cywaj\u0105c ustawie\u0 systemSettings.filedataSize=Wielko\u015b\u0107 plik\u00f3w systemSettings.totalSize=Rozmiar ca\u0142kowity systemSettings.historyCount=Ilo\u015b\u0107 historii -systemSettings.topPoints=Punkty top'owe +systemSettings.topPoints=Punkty top’owe systemSettings.eventCount=Ilo\u015b\u0107 zdarze\u0144 systemSettings.testEmail=Your system settings test email was successfully sent. systemSettings.versionCheck1=Socket timeout during check. Please try again @@ -1915,7 +1914,7 @@ viewEdit.fullScreen=Pe\u0142ny ekran views.title=Schematy views.newView=Nowy schemat -views.noViews=Nie masz \u017cadnych schamt\u00f3w.Utw\u00f3rz teraz. +views.noViews=Nie masz \u017cadnych schemat\u00f3w. Utw\u00f3rz watchlist.addToWatchlist=Dodaj do listy watchlist.points=Punkty @@ -2001,7 +2000,7 @@ event.system.process=B\u0142\u0105d obs\u0142ugi zdarzenia event.audit.added=User "{0}" created {1} with id {2}: {3} event.audit.changed=User "{0}" changed {1} with id {2}: {3} -event.audit.changedProperty=
    {0}: "{1}" to "{2}" +event.audit.changedProperty={0}: "{1}" to "{2}" event.audit.compoundEventDetector=Compound event detector event.audit.dataPoint=Data point event.audit.dataSource=Data source @@ -2010,7 +2009,7 @@ event.audit.eventHandler=Event handler event.audit.maintenanceEvent=Maintenance event event.audit.pointEventDetector=Point event detector event.audit.pointLink=Point link -event.audit.property=
    {0}="{1}" +event.audit.property={0}="{1}" event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2133,8 +2132,8 @@ event.valueParse.timeParse=Failed to parse time "{0}" event.valueParse.timeParsePoint=Failed to parse time "{0}" for {1} event.valueParse.textParse=Value did not match any multistate text and was not parsable, result={0} event.valueParse.textParsePoint=Value did not match any multistate text and was not parsable, result={0}, point={1} -event.valueParse.numericParse=Couldn't parse to numeric, result={0} -event.valueParse.numericParsePoint=Couldn't parse to numeric, result={0}, point={1} +event.valueParse.numericParse=Couldn’t parse to numeric, result={0} +event.valueParse.numericParsePoint=Couldn’t parse to numeric, result={0}, point={1} event.valueParse.generalParse={0}, result={1} event.valueParse.generalParsePoint={0}, result={1}, point={2} event.1wire.deviceRead=Error reading device at address {0}: {1} @@ -2353,7 +2352,7 @@ emport.error.eventCode=Invalid event code ''{0}''. Valid codes are {1} emport.error.alarmLevel=Invalid alarm level ''{0}'' for event ''{1}''. Valid values are {2} emport.error.missingUser=User with username ''{0}'' not found emport.error.viewShare.missing=Missing ''{0}'' in view share -emport.error.component.incompatibleDataType=Data point with 'XID' ''{0}'' has a data type that is not compatible with view component type ''{1}'' +emport.error.component.incompatibleDataType=Data point with ’XID’ ''{0}'' has a data type that is not compatible with view component type ''{1}'' emport.error.compound.invalidChildId=Invalid child id ''{0}'' for compound view component of type ''{1}''. Valid ids are {2} emport.error.component.unknownDynamicImage=Dynamic image id ''{0}'' not found. Known dynamic image ids are {1} emport.error.component.unknownImageSet=Image set id ''{0}'' not found. Known image set ids are {1} @@ -2569,8 +2568,8 @@ engUnit.188=newtons per meter engUnit.189=watts per meter per degree kelvin engUnit.190=kilometers -engUnit.abbr.0=m2 -engUnit.abbr.1=f2 +engUnit.abbr.0=m\u00b2 +engUnit.abbr.1=ft\u00b2 engUnit.abbr.2=mA engUnit.abbr.3=A engUnit.abbr.4=ohms @@ -3026,7 +3025,7 @@ emport.errorMessage=B\u0142\u0119dy: emport.uploadError=Upload failed ({0}) emport.invalidFile=File reading failed ({0}) -emport.versionError=The project version ({0}) isn't compatible with current system version ({1}) +emport.versionError=The project version ({0}) isn’t compatible with current system version ({1}) dox.exportProject=Exporting projects dox.importProject=Importing projects @@ -3092,7 +3091,7 @@ users.theme.dark=Ciemny viewEdit.moveDownComponent=Send to back viewEdit.moveUpComponent=Bring to front emport.profilePermission.prefix=Uprawnienia dla profilu ''{0}'': {1} -dox.anonymousView=Dost0119p anonimowy +dox.anonymousView=Dost\u0119p anonimowy viewEdit.position.x=Położenie X viewEdit.position.y=Położenie Y @@ -3273,7 +3272,7 @@ mport.graphicsFolder=Include Graphics folder graphic.enhancedImageChart.seriesConfig=Series configuration dsEdit.radiuino.pollingMode=Polling mode pointHierarchySLTS.changeOfLanguageFailed=Change of language failed -pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don't remove data point in root hierarchy +pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don’t remove data point in root hierarchy publisherEdit.httpSender.point.status=Status dsEdit.radiuino.stopBits=Stop Bits userProfiles.none=None @@ -3477,4 +3476,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor +pointEdit.buttons.note.prefix=Notatka: +sql.warning.prefix=Ostrzeżenie: +views.noViews.prefix=teraz. annotation.api=REST API +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/messages_pt.properties b/test/messages_pt.properties index ffaeba325c..22b4325781 100644 --- a/test/messages_pt.properties +++ b/test/messages_pt.properties @@ -685,7 +685,7 @@ dsEdit.meta.event.week=In\u00edcio da semana dsEdit.meta.event.month=In\u00edcio do m\u00eas dsEdit.meta.event.year=In\u00edcio do ano dsEdit.meta.event.cron=Padr\u00e3o cron -dsEdit.meta.delay=Atraso de execu\u00e7\u00e3o
+dsEdit.meta.delay=Atraso de execu\u00e7\u00e3o dsEdit.meta.test.success=Successo. resultado={0} dsEdit.meta.test.successTs=Successo. resultado={0}, timestamp={1} dsEdit.meta.test.context=Um ou mais pontos est\u00e3o desabilitados ou faltando @@ -993,16 +993,16 @@ dsEdit.viconics.networkInfo=Informa\u00e7\u00e3o da rede dsEdit.viconics.refreshing=Atualizando... dsEdit.viconics.rfModule=M\u00f3dulo RF dsEdit.viconics.devices=Dispositivos -dsEdit.viconics.commAddress=Endere\u00e7os
Comm -dsEdit.viconics.modelNumber=N\u00famero de
modelo -dsEdit.viconics.firmwareRevision=Revis\u00e3o de
Firmware +dsEdit.viconics.commAddress=Endere\u00e7os Comm +dsEdit.viconics.modelNumber=N\u00famero de modelo +dsEdit.viconics.firmwareRevision=Revis\u00e3o de Firmware dsEdit.viconics.zigbeeFirmwareRevision=Revis\u00e3o de firmware Zigbee -dsEdit.viconics.zigbeeFirmwareRevisionBr=Revis\u00e3o de
firmware
Zigbee +dsEdit.viconics.zigbeeFirmwareRevisionBr=Revis\u00e3o de firmware Zigbee dsEdit.viconics.zigbeeNetworkAddress=Endere\u00e7o de rede Zigbee -dsEdit.viconics.zigbeeNetworkAddressBr=Endere\u00e7o de
rede
Zigbee +dsEdit.viconics.zigbeeNetworkAddressBr=Endere\u00e7o de rede Zigbee dsEdit.viconics.ieee=IEEE dsEdit.viconics.chipRevision=Revis\u00e3o do Chip -dsEdit.viconics.chipRevisionBr=Revis\u00e3o do
chip +dsEdit.viconics.chipRevisionBr=Revis\u00e3o do chip dsEdit.viconics.trss=TRSS dsEdit.viconics.crss=CRSS dsEdit.viconics.unreliable=Valor do ponto pode n\u00e3o ser confi\u00e1vel @@ -1204,42 +1204,42 @@ emport.importProgress=Importa\u00e7\u00e3o em progresso... emport.importCancelled=Importa\u00e7\u00e3o cancelada emport.importComplete=Importa\u00e7\u00e3o completa emport.noMessages=Mensagem sem resultados. Nada a importar? -emport.invalidImportData=Dado para importa\u00e7\u00e3o inv\u00e1lido: n\u00e3o \u00e9 um objeto JSON +emport.invalidImportData=Dado para importa\u00e7\u00e3o inv\u00e1lido: n\u00e3o \u00e9 um objeto JSON. (www.json.org) emport.parseError=Erro de an\u00e1lise JSON: {0} -emport.user.username=Um usu\u00e1rio n\u00e3o tem um valor 'nome de usu\u00e1rio'. Ignorado. +emport.user.username=Um usu\u00e1rio n\u00e3o tem um valor ’nome de usu\u00e1rio’. Ignorado. emport.user.prefix=Usu\u00e1rio ''{0}'': {1} -emport.view.missingType=Visualiza\u00e7\u00e3o com XID ''{0}'' n\u00e3o existe atualmente e n\u00e3o tem um valor 'tipo'. Tipos v\u00e1lidos s\u00e3o {1} -emport.dataSource.xid=Um data source com nome ''{0}'' n\u00e3o tem um valor 'xid' v\u00e1lido. Ignorado. -emport.dataSource.missingType=Data source com XID ''{0}'' n\u00e3o existe atualmente e n\u00e3o tem um valor 'tipo'. Tipos v\u00e1lidos s\u00e3o {1} -emport.dataSource.invalidType=Data source com XID ''{0}''n\u00e3o existe atualmente e tem um valor 'tipo' inv\u00e1lido: ''{1}''. Tipos v\u00e1lidos s\u00e3o {2} +emport.view.missingType=Visualiza\u00e7\u00e3o com XID ''{0}'' n\u00e3o existe atualmente e n\u00e3o tem um valor ’tipo’. Tipos v\u00e1lidos s\u00e3o {1} +emport.dataSource.xid=Um data source com nome ''{0}'' n\u00e3o tem um valor ’xid’ v\u00e1lido. Ignorado. +emport.dataSource.missingType=Data source com XID ''{0}'' n\u00e3o existe atualmente e n\u00e3o tem um valor ’tipo’. Tipos v\u00e1lidos s\u00e3o {1} +emport.dataSource.invalidType=Data source com XID ''{0}'' n\u00e3o existe atualmente e tem um valor ’tipo’ inv\u00e1lido: ''{1}''. Tipos v\u00e1lidos s\u00e3o {2} emport.dataSource.prefix=Data source ''{0}'': {1} -emport.dataPoint.xid=Um data point com name ''{0}'' n\u00e3o tem um valor 'xid'. Ignorado. +emport.dataPoint.xid=Um data point com name ''{0}'' n\u00e3o tem um valor ’xid’. Ignorado. emport.dataPoint.badReference=Data point com XID ''{0}'' n\u00e3o existe atualmente e referencia um data source que n\u00e3o existe. Ignorado. emport.dataPoint.prefix=Data point ''{0}'': {1} emport.userPermission.prefix=Permiss\u00f5es para usu\u00e1rio ''{0}'': {1} emport.added=adicionado emport.saved=salvo emport.causedBy=causado por: -emport.view.xid=Uma visualiza\u00e7\u00e3o gr\u00e1fica n\u00e3o possui um valor 'xid'. Ignorado. +emport.view.xid=Uma visualiza\u00e7\u00e3o gr\u00e1fica n\u00e3o possui um valor ’xid’. Ignorado. emport.view.prefix=Visualiza\u00e7\u00e3o ''{0}'': {1} emport.pointHierarchy.prefix=Hierarquia de ponto: {0} -emport.pointLink.xid=Um v\u00ednculo de ponto n\u00e3o possui um valor 'xid'. Ignorado. +emport.pointLink.xid=Um v\u00ednculo de ponto n\u00e3o possui um valor ’xid’. Ignorado. emport.pointLink.prefix=V\u00ednculo de ponto ''{0}'': {1} -emport.scheduledEvent.xid=Um evento agendado n\u00e3o possui um valor 'xid'. Ignorado. +emport.scheduledEvent.xid=Um evento agendado n\u00e3o possui um valor ’xid’. Ignorado. emport.scheduledEvent.prefix=Evento agendado ''{0}'': {1} -emport.compoundEvent.xid=Um detector de eventos compostos n\u00e3o possui um valor 'xid'. Ignorado. +emport.compoundEvent.xid=Um detector de eventos compostos n\u00e3o possui um valor ’xid’. Ignorado. emport.compoundEvent.prefix=Detector de eventos compostos ''{0}'': {1} -emport.mailingList.xid=Uma lista de envio de mensagens n\u00e3o possui um valor 'xid'. Ignorado. +emport.mailingList.xid=Uma lista de envio de mensagens n\u00e3o possui um valor ’xid’. Ignorado. emport.mailingList.prefix=Lista de envio de mensagens ''{0}'': {1} -emport.eventHandler.xid=Um v\u00ednculo de ponto n\u00e3o posssui um valor 'xid'. Ignorado. +emport.eventHandler.xid=Um v\u00ednculo de ponto n\u00e3o posssui um valor ’xid’. Ignorado. emport.eventHandler.prefix=V\u00ednculo de ponto ''{0}'': {1} -emport.publisher.xid=Um data source com nome ''{0}'' n\u00e3o tem um valor 'xid'. Ignorado. -emport.publisher.missingType=Publisher com XID ''{0}'' n\u00e3o existe atualmente e n\u00e3o possui um valor 'tipo'. Tipos v\u00e1lidos s\u00e3o {1} -emport.publisher.invalidType=Publisher com XID ''{0}'' n\u00e3o existe atualmente e tem um valor 'tipo' inv\u00e1lido: ''{1}''. Tipos v\u00e1lidos s\u00e3o {2} +emport.publisher.xid=Um data source com nome ''{0}'' n\u00e3o tem um valor ’xid’. Ignorado. +emport.publisher.missingType=Publisher com XID ''{0}'' n\u00e3o existe atualmente e n\u00e3o possui um valor ’tipo’. Tipos v\u00e1lidos s\u00e3o {1} +emport.publisher.invalidType=Publisher com XID ''{0}'' n\u00e3o existe atualmente e tem um valor ’tipo’ inv\u00e1lido: ''{1}''. Tipos v\u00e1lidos s\u00e3o {2} emport.publisher.prefix=Publisher ''{0}'': {1} -emport.watchList.xid=Uma lista de visualiza\u00e7\u00e3o n\u00e3o possui um valor para 'xid'. Ignorada. +emport.watchList.xid=Uma lista de visualiza\u00e7\u00e3o n\u00e3o possui um valor para ’xid’. Ignorada. emport.watchList.prefix=Lista de visualiza\u00e7\u00e3o ''{0}'': {1} -emport.maintenanceEvent.xid=Um evento de manuten\u00e7\u00e3o n\u00e3o possui um valor para 'xid'. Ignorado. +emport.maintenanceEvent.xid=Um evento de manuten\u00e7\u00e3o n\u00e3o possui um valor para ’xid’. Ignorado. emport.maintenanceEvent.prefix=Evento de manuten\u00e7\u00e3o ''{0}'': {1} eventHandlers.recipTestEmailMessage= Essa mensagem foi enviada como um teste de um tratador de evento de email @@ -1377,7 +1377,7 @@ login.validation.accountDisabled=Sua conta de usu\u00e1rio foi desativada. Por f login.loginButton=Login login.unknownBrowser=Checando a compatibilidade do browser... login.supportedBrowser=Este browser \u00e9 suportado. -login.unsupportedBrowser=Seu browser pode funcionar com este produto, mas n\u00e3o \u00e9 oficialmente suportado pela Equipe Scada-LTS. Recomendamos o uso do Firefox ou Chrome. +login.unsupportedBrowser=Seu browser pode funcionar com este produto, mas n\u00e3o \u00e9 oficialmente suportado pela Equipe Scada-LTS. Recomendamos o uso do Mozilla Firefox, Google Chrome. login.nag=NOTA: voc\u00ea poder\u00e1 ter problemas com o ScadaLTS porque seu browser n\u00e3o \u00e9 oficialmente suportado. Por favor, atualize seu browser. mailingLists.added=Lista de envio adicionada mailingLists.saved=Lista de envio salva @@ -1443,7 +1443,7 @@ notes.cancel=Cancelar notes.timeByUsername=time by username notification.newui.title=New page is available! notification.newui.move=Move! -notification.newui.dontshow=Don't show again. +notification.newui.dontshow=Don’t show again. pointDetails.recordCountError=Contagem de grava\u00e7\u00e3o precisa ser um n\u00famero pointDetails.timePeriodError=Tempo precisa ser um n\u00famero pointDetails.imageCountError=Contagem de imagem precisa ser um n\u00famero @@ -1479,7 +1479,7 @@ pointDetails.accessType=Tipo de acesso pointEdit.buttons.enable=Habilitar pointEdit.buttons.disable=Desabilitar pointEdit.buttons.restart=Reiniciar -pointEdit.buttons.note=Nota: salvar, desabilitar ou reiniciar um data point far\u00e1 com que todos os eventos ativos retornem ao normal. +pointEdit.buttons.note=salvar, desabilitar ou reiniciar um data point far\u00e1 com que todos os eventos ativos retornem ao normal. pointEdit.chart.props=Propriedades do renderizador de gr\u00e1ficos pointEdit.chart.type=Tipo @@ -1632,7 +1632,7 @@ pointHierarchySLTS.dataSource=Data source pointHierarchySLTS.xid=XID pointHierarchySLTS.type=Type pointHierarchySLTS.changeOfLanguageFailed=Change of language failed -pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don't remove data point in root hierarchy +pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don’t remove data point in root hierarchy pointHierarchySLTS.moveDataPointToRoot=Move the element to root level tree pointHierarchySLTS.areYouSureToMoveElement=Are you sure to move element? pointHierarchySLTS.movedElement=Moved element @@ -1836,7 +1836,7 @@ scheduledEvents.validate.inactiveTrigger=Erro ao criar gatilho inativo: {0} scheduledEvents.validate.aliasTooLong=Alias n\u00e3o pode ser maior que 50 caracteres scheduledEvents.validate.invalidRtn=Inactive time must be after active time -sql.warning=Alerta: use esta funcionalidade por risco pr\u00f3prio. Uso incorreto pode resultar em dados corrompidos e/ou falhas no sistema. +sql.warning=use esta funcionalidade por risco pr\u00f3prio. Uso incorreto pode resultar em dados corrompidos e/ou falhas no sistema. sql.sql=SQL sql.query=Enviar consulta sql.update=Enviar atualiza\u00e7\u00e3o @@ -2032,7 +2032,7 @@ viewEdit.compound.duration=Dura\u00e7\u00e3o views.title=Representa\u00e7\u00f5es Gr\u00e1ficas views.newView=Nova representa\u00e7\u00e3o -views.noViews=Voc\u00ea n\u00e3o criou nenhuma representa\u00e7\u00e3o gr\u00e1fica. Crie uma agora. +views.noViews=Voc\u00ea n\u00e3o criou nenhuma representa\u00e7\u00e3o gr\u00e1fica. Crie uma watchlist.addToWatchlist=Adicionar na watch list watchlist.points=Points @@ -2130,7 +2130,7 @@ event.system.process=Falha do processo do tratador de eventos event.audit.added=User "{0}" criado {1} com id {2}: {3} event.audit.changed=User "{0}" alerado {1} com id {2}: {3} -event.audit.changedProperty=
    {0}: "{1}" to "{2}" +event.audit.changedProperty={0}: "{1}" to "{2}" event.audit.compoundEventDetector=Detector de evento composto event.audit.dataPoint=Data point event.audit.dataSource=Data source @@ -2139,7 +2139,7 @@ event.audit.eventHandler=Tratador de evento event.audit.maintenanceEvent=Evento de manuten\u00e7\u00e3o event.audit.pointEventDetector=Detector de evento de data point event.audit.pointLink=Point link -event.audit.property=
    {0}="{1}" +event.audit.property={0}="{1}" event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2380,7 +2380,7 @@ event.ds.initialization=Exce\u00e7\u00e3o de inicializa\u00e7\u00e3o event.ds.message=Exce\u00e7\u00e3o de mensagem event.ds.device=Exce\u00e7\u00e3o de dispositivo event.ds.network=Exce\u00e7\u00e3o de rede -event.ds.duplicateComm=Endere\u00e7o comm duplicado detectado +event.ds.duplicateComm=Endere\u00e7o comm duplicado detectado event.ds.dataSource=Exce\u00e7\u00e3o de data source event.ds.pointRead=Exce\u00e7\u00e3o de leitura de data point event.ds.pointWrite=Exce\u00e7\u00e3o de escrita em data point @@ -2479,7 +2479,7 @@ emport.error.eventCode=C\u00f3digo de evento ''{0}'' inv\u00e1lido. C\u00f3digos emport.error.alarmLevel=N\u00edvel de alarme ''{0}'' inv\u00e1lido para evento ''{1}''. Valores v\u00e1lidos s\u00e3o {2} emport.error.missingUser=Usu\u00e1rio com nome de usu\u00e1rio ''{0}'' n\u00e3o encontrado emport.error.viewShare.missing=''{0}'' faltando em compartilhamento da representa\u00e7\u00e3o -emport.error.component.incompatibleDataType=Data point com 'XID' ''{0}'' possui tipo de dado n\u00e3o compat\u00edvel com com tipo de visualiza\u00e7\u00e3o de componente ''{1}'' +emport.error.component.incompatibleDataType=Data point com ’XID’ ''{0}'' possui tipo de dado n\u00e3o compat\u00edvel com com tipo de visualiza\u00e7\u00e3o de componente ''{1}'' emport.error.compound.invalidChildId=Id filho ''{0}'' inv\u00e1lido para componente de visualiza\u00e7\u00e3o composto do tipo ''{1}''. Ids v\u00e1lidos s\u00e3o {2} emport.error.component.unknownDynamicImage=Id de imagem din\u00e2mica ''{0}'' n\u00e3o encontrado. Ids de imagens din\u00e2micas s\u00e3o {1} emport.error.component.unknownImageSet=Id de defini\u00e7\u00e3o de imagem ''{0}'' n\u00e3o encontrado. Ids de defini\u00e7\u00e3o de imagem conhecidos s\u00e3o {1} @@ -2695,8 +2695,8 @@ engUnit.188=Newtons por metro engUnit.189=watts por metro por Kelvin engUnit.190=kilometros -engUnit.abbr.0=m2 -engUnit.abbr.1=f2 +engUnit.abbr.0=m\u00b2 +engUnit.abbr.1=ft\u00b2 engUnit.abbr.2=mA engUnit.abbr.3=A engUnit.abbr.4=ohms @@ -2718,22 +2718,22 @@ engUnit.abbr.19=kWh engUnit.abbr.20=btus engUnit.abbr.21=therms engUnit.abbr.22=ton hours -engUnit.abbr.23=J/Kg ar seco -engUnit.abbr.24=btus/lb ar seco +engUnit.abbr.23=J/Kg ar seco +engUnit.abbr.24=btus/lb ar seco engUnit.abbr.25=ciclos por hora engUnit.abbr.26=ciclos por minuto engUnit.abbr.27=hertz -engUnit.abbr.28=g H2O / kg ar seco +engUnit.abbr.28=g H\u2082O / kg ar seco engUnit.abbr.29=%UR engUnit.abbr.30=mm engUnit.abbr.31=m engUnit.abbr.32=pol engUnit.abbr.33=p\u00e9s -engUnit.abbr.34=W/p\u00e92 -engUnit.abbr.35=W/m2 +engUnit.abbr.34=W/p\u00e9\u00b2 +engUnit.abbr.35=W/m\u00b2 engUnit.abbr.36=lm engUnit.abbr.37=lx -engUnit.abbr.38=lm/p\u00e92 +engUnit.abbr.38=lm/p\u00e9\u00b2 engUnit.abbr.39=kg engUnit.abbr.40=lb engUnit.abbr.41=t @@ -2751,12 +2751,12 @@ engUnit.abbr.52=RT engUnit.abbr.53=Pa engUnit.abbr.54=kPa engUnit.abbr.55=bar -engUnit.abbr.56=lbf/pol2 -engUnit.abbr.57=cmH2O -engUnit.abbr.58=polH2O -engUnit.abbr.59=mmHg -engUnit.abbr.60=cmHg -engUnit.abbr.61=polHg +engUnit.abbr.56=lbf/pol\u00b2 +engUnit.abbr.57=cmH\u2082O +engUnit.abbr.58=polH\u2082O +engUnit.abbr.59=mmHg +engUnit.abbr.60=cmHg +engUnit.abbr.61=polHg engUnit.abbr.62=°C engUnit.abbr.63=K engUnit.abbr.64=°F @@ -2774,17 +2774,17 @@ engUnit.abbr.75=km/h engUnit.abbr.76=p\u00e9s/s engUnit.abbr.77=p\u00e9s/min engUnit.abbr.78=m/h -engUnit.abbr.79=p\u00e9s3 -engUnit.abbr.80=m3 -engUnit.abbr.81=GaUK +engUnit.abbr.79=p\u00e9s\u00b3 +engUnit.abbr.80=m\u00b3 +engUnit.abbr.81=GaUK engUnit.abbr.82=l -engUnit.abbr.83=GaUS -engUnit.abbr.84=p\u00e9s3/min -engUnit.abbr.85=m3/s -engUnit.abbr.86=GaUK/min +engUnit.abbr.83=GaUS +engUnit.abbr.84=p\u00e9s\u00b3/min +engUnit.abbr.85=m\u00b3/s +engUnit.abbr.86=GaUK/min engUnit.abbr.87=l/s engUnit.abbr.88=l/m -engUnit.abbr.89=GaUS/min +engUnit.abbr.89=GaUS/min engUnit.abbr.90=° engUnit.abbr.91=°C/h engUnit.abbr.92=°F/min @@ -2810,8 +2810,8 @@ engUnit.abbr.111=currency 7 engUnit.abbr.112=currency 8 engUnit.abbr.113=currency 9 engUnit.abbr.114=currency 10 -engUnit.abbr.115=pol2 -engUnit.abbr.116=cm2 +engUnit.abbr.115=pol\u00b2 +engUnit.abbr.116=cm\u00b2 engUnit.abbr.117=BTU/lb engUnit.abbr.118=cm engUnit.abbr.119=lb/s @@ -2830,22 +2830,22 @@ engUnit.abbr.131=/h engUnit.abbr.132=mW engUnit.abbr.133=hPa engUnit.abbr.134=mbar -engUnit.abbr.135=m3/h +engUnit.abbr.135=m\u00b3/h engUnit.abbr.136=l/h -engUnit.abbr.137=kWh/m2 -engUnit.abbr.138=kWh/p\u00e92 -engUnit.abbr.139=MJ/m2 -engUnit.abbr.140=MJ/p\u00e92 -engUnit.abbr.141=W/m2K -engUnit.abbr.142=p\u00e9s3/s +engUnit.abbr.137=kWh/m\u00b2 +engUnit.abbr.138=kWh/p\u00e9\u00b2 +engUnit.abbr.139=MJ/m\u00b2 +engUnit.abbr.140=MJ/p\u00e9\u00b2 +engUnit.abbr.141=W/m\u00b2K +engUnit.abbr.142=p\u00e9s\u00b3/s engUnit.abbr.143=%obs/p\u00e9 engUnit.abbr.144=%pbs/m engUnit.abbr.145=mΩ engUnit.abbr.146=MWh engUnit.abbr.147=kBTU engUnit.abbr.148=MBTU -engUnit.abbr.149=kJ/kgar seco -engUnit.abbr.150=MJ/kgar seco +engUnit.abbr.149=kJ/kg ar seco +engUnit.abbr.150=MJ/kg ar seco engUnit.abbr.151=kJ/K engUnit.abbr.152=MJ/K engUnit.abbr.153=N @@ -2853,18 +2853,18 @@ engUnit.abbr.154=g/s engUnit.abbr.155=g/min engUnit.abbr.156=t/h engUnit.abbr.157=kBTU/h -engUnit.abbr.158=s x 102 +engUnit.abbr.158=s x 10\u00b2 engUnit.abbr.159=ms engUnit.abbr.160=Nm engUnit.abbr.161=mm/s engUnit.abbr.162=mm/min engUnit.abbr.163=m/min engUnit.abbr.164=m/h -engUnit.abbr.165=m3/min -engUnit.abbr.166=m/s2 +engUnit.abbr.165=m\u00b3/min +engUnit.abbr.166=m/s\u00b2 engUnit.abbr.167=A/m -engUnit.abbr.168=A/m2 -engUnit.abbr.169=Am2 +engUnit.abbr.168=A/m\u00b2 +engUnit.abbr.169=Am\u00b2 engUnit.abbr.170=Fd engUnit.abbr.171=H engUnit.abbr.172=Ωm @@ -2875,13 +2875,13 @@ engUnit.abbr.176=V/K engUnit.abbr.177=V/m engUnit.abbr.178=Wb engUnit.abbr.179=cd -engUnit.abbr.180=cd/m2 +engUnit.abbr.180=cd/m\u00b2 engUnit.abbr.181=K/h engUnit.abbr.182=K/min engUnit.abbr.183=Js engUnit.abbr.184=rad/s -engUnit.abbr.185=m2/N -engUnit.abbr.186=kg/m3 +engUnit.abbr.185=m\u00b2/N +engUnit.abbr.186=kg/m\u00b3 engUnit.abbr.187=Ns engUnit.abbr.188=N/m engUnit.abbr.189=W/mK @@ -3349,7 +3349,7 @@ dsEdit.mbus.phoneNumber=Phone Number graphic.enhancedImageChart.config.zoomOut=Zoom out dsEdit.mbus.tcpAddr=TCP Address pointHierarchySLTS.folder=Folder -eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler's inactive list +eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler’s inactive list graphic.enhancedImageChart.pointConfig.renderMode.line=Line event.maintenance.active=Maintenance event activated\: {0} dsEdit.snmp.sl.authnopriv=Only authentication @@ -3491,4 +3491,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor +pointEdit.buttons.note.prefix=Nota: +sql.warning.prefix=Alerta: +views.noViews.prefix=agora. annotation.api=REST API +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/messages_ru.properties b/test/messages_ru.properties index 5fc1d749e7..aa0dc3aa32 100644 --- a/test/messages_ru.properties +++ b/test/messages_ru.properties @@ -666,7 +666,7 @@ dsEdit.meta.event.week=\u041d\u0430\u0447\u0430\u043b\u043e \u043d\u0435\u0434\u dsEdit.meta.event.month=\u041d\u0430\u0447\u0430\u043b\u043e \u043c\u0435\u0441\u044f\u0446\u0430 dsEdit.meta.event.year=\u041d\u0430\u0447\u0430\u043b\u043e \u0433\u043e\u0434\u0430 dsEdit.meta.event.cron=\u0428\u0430\u0431\u043b\u043e\u043d \u043a\u0440\u043e\u043d\u0430 -dsEdit.meta.delay=\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f
+dsEdit.meta.delay=\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f dsEdit.meta.test.success=\u0423\u0441\u043f\u0435\u0448\u043d\u043e. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442={0} dsEdit.meta.test.successTs=\u0423\u0441\u043f\u0435\u0448\u043d\u043e. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442={0}, \u0432\u0440\u0435\u043c\u044f={1} dsEdit.meta.test.context=\u041e\u0434\u043d\u0430 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u0435\u043a \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 @@ -968,16 +968,16 @@ dsEdit.viconics.networkInfo=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u04 dsEdit.viconics.refreshing=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435... dsEdit.viconics.rfModule=\u0420\u0430\u0434\u0438\u043e\u043c\u043e\u0434\u0443\u043b\u044c dsEdit.viconics.devices=\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 -dsEdit.viconics.commAddress=\u0410\u0434\u0440\u0435\u0441
\u0441\u0432\u044f\u0437\u0438 -dsEdit.viconics.modelNumber=\u041d\u043e\u043c\u0435\u0440
\u043c\u043e\u0434\u0435\u043b\u0438 -dsEdit.viconics.firmwareRevision=\u0412\u0435\u0440\u0441\u0438\u044f
\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b +dsEdit.viconics.commAddress=\u0410\u0434\u0440\u0435\u0441 \u0441\u0432\u044f\u0437\u0438 +dsEdit.viconics.modelNumber=\u041d\u043e\u043c\u0435\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 +dsEdit.viconics.firmwareRevision=\u0412\u0435\u0440\u0441\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b dsEdit.viconics.zigbeeFirmwareRevision=\u0412\u0435\u0440\u0441\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Zigbee -dsEdit.viconics.zigbeeFirmwareRevisionBr= \u0412\u0435\u0440\u0441\u0438\u044f
\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b
Zigbee +dsEdit.viconics.zigbeeFirmwareRevisionBr= \u0412\u0435\u0440\u0441\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Zigbee dsEdit.viconics.zigbeeNetworkAddress=\u0410\u0434\u0440\u0435\u0441 \u0441\u0435\u0442\u0438 Zigbee -dsEdit.viconics.zigbeeNetworkAddressBr= \u0410\u0434\u0440\u0435\u0441
\u0441\u0435\u0442\u0438
Zigbee +dsEdit.viconics.zigbeeNetworkAddressBr= \u0410\u0434\u0440\u0435\u0441 \u0441\u0435\u0442\u0438 Zigbee dsEdit.viconics.ieee=IEEE dsEdit.viconics.chipRevision=\u0412\u0435\u0440\u0441\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0447\u0438\u043f\u0430 -dsEdit.viconics.chipRevisionBr=\u0412\u0435\u0440\u0441\u0438\u044f
\u043c\u0438\u043a\u0440\u043e\u0447\u0438\u043f\u0430 +dsEdit.viconics.chipRevisionBr=\u0412\u0435\u0440\u0441\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0447\u0438\u043f\u0430 dsEdit.viconics.trss=TRSS dsEdit.viconics.crss=CRSS dsEdit.viconics.unreliable=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u043c @@ -1120,42 +1120,42 @@ emport.importProgress=\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u04 emport.importCancelled=\u0418\u043c\u043f\u043e\u0440\u0442 \u043e\u0442\u043c\u0435\u043d\u0435\u043d emport.importComplete=\u0418\u043c\u043f\u043e\u0440\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d emport.noMessages=\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041d\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430? -emport.invalidImportData=\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430: \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c JSON +emport.invalidImportData=\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430: \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c JSON. (www.json.org) emport.parseError=\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 JSON : {0} emport.user.username=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 '\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.user.prefix=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c ''{0}'': {1} emport.view.missingType=\u0412\u0438\u0434 \u0441 XID ''{0}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 '\u0442\u0438\u043f' \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b: {1} -emport.dataSource.xid=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c ''{0}'' \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. -emport.dataSource.missingType=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 XID ''{0}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 '\u0442\u0438\u043f' \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b: {1} +emport.dataSource.xid=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c ''{0}'' \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. +emport.dataSource.missingType=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 XID ''{0}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ’\u0442\u0438\u043f’ \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b: {1} emport.dataSource.invalidType=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 XID ''{0}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 '\u0442\u0438\u043f' \u0434\u043b\u044f ''{1}''. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b: {2} emport.dataSource.prefix=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 ''{0}'': {1} -emport.dataPoint.xid=\u0414\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c ''{0}'' \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. +emport.dataPoint.xid=\u0414\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c ''{0}'' \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.dataPoint.badReference=\u0422\u043e\u0447\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 XID ''{0}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.dataPoint.prefix=\u041e\u0431\u044a\u0435\u043a\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 ''{0}'': {1} emport.userPermission.prefix=\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f ''{0}'': {1} emport.added=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e emport.saved=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e emport.causedBy=\u0412\u044b\u0437\u0432\u0430\u043d\u043e: -emport.view.xid=\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0438\u0434 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. +emport.view.xid=\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0438\u0434 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.view.prefix=\u0412\u0438\u0434 ''{0}'': {1} emport.pointHierarchy.prefix=\u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432: {0} -emport.pointLink.xid=\u0421\u0432\u044f\u0437\u044c \u0442\u043e\u0447\u0435\u043a \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. +emport.pointLink.xid=\u0421\u0432\u044f\u0437\u044c \u0442\u043e\u0447\u0435\u043a \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.pointLink.prefix=\u0421\u0432\u044f\u0437\u044c \u0442\u043e\u0447\u0435\u043a ''{0}'': {1} -emport.scheduledEvent.xid=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. +emport.scheduledEvent.xid=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.scheduledEvent.prefix=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 ''{0}'': {1} -emport.compoundEvent.xid=\u0421\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 +emport.compoundEvent.xid=\u0421\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 emport.compoundEvent.prefix=\u0421\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 ''{0}'': {1} -emport.mailingList.xid=\u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. +emport.mailingList.xid=\u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.mailingList.prefix=\u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 ''{0}'': {1} -emport.eventHandler.xid=\u0421\u0432\u044f\u0437\u044c \u0442\u043e\u0447\u043a\u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. +emport.eventHandler.xid=\u0421\u0432\u044f\u0437\u044c \u0442\u043e\u0447\u043a\u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.eventHandler.prefix=\u0421\u0432\u044f\u0437\u044c \u0442\u043e\u0447\u043a\u0438 ''{0}'': {1} -emport.publisher.xid=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c ''{0}'' \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. +emport.publisher.xid=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c ''{0}'' \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.publisher.missingType=\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0440 \u0441 XID ''{0}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f '\u0442\u0438\u043f'. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b: {1} emport.publisher.invalidType=\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0440 \u0441 XID ''{0}'' \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 '\u0442\u0438\u043f' \u0434\u043b\u044f ''{1}''. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: {2} emport.publisher.prefix=\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0440 ''{0}'': {1} -emport.watchList.xid=\u041b\u0438\u0441\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. +emport.watchList.xid=\u041b\u0438\u0441\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.watchList.prefix=\u041b\u0438\u0441\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f ''{0}'': {1} -emport.maintenanceEvent.xid=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'XID'. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. +emport.maintenanceEvent.xid=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f ’XID’. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430. emport.maintenanceEvent.prefix=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f ''{0}'': {1} eventHandlers.recipTestEmailMessage=\u0414\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439) @@ -1294,7 +1294,7 @@ login.validation.accountDisabled=\u0412\u0430\u0448 \u0430\u043a\u043a\u0430\u04 login.loginButton=\u041b\u043e\u0433\u0438\u043d login.unknownBrowser=\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0412\u0430\u0448\u0435\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430... login.supportedBrowser=\u0412\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f. -login.unsupportedBrowser=\u0412\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c, \u043d\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\u043c Scada-LTS. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e Firefox, Chrome, \u0438\u043b\u0438 Internet Explorer 7. +login.unsupportedBrowser=\u0412\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c, \u043d\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\u043c Scada-LTS. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e Mozilla Firefox, Google Chrome. login.nag=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e ScadaLTS, \u0442\u0430\u043a \u043a\u0430\u043a \u0412\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440. mailingLists.added=\u0421\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d @@ -1362,7 +1362,7 @@ notes.cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c notes.timeByUsername=\u0412\u0440\u0435\u043c\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f notification.newui.title=New page is available! notification.newui.move=Move! -notification.newui.dontshow=Don't show again. +notification.newui.dontshow=Don’t show again. pointDetails.recordCountError=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u043c pointDetails.timePeriodError=\u041f\u0435\u0440\u0438\u043e\u0434 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u043c pointDetails.imageCountError=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0447\u0438\u0441\u043b\u043e\u043c @@ -1398,7 +1398,7 @@ pointDetails.accessType=\u0422\u0438\u043f \u0434\u043e\u0441\u0442\u0443\u043f\ pointEdit.buttons.enable=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c pointEdit.buttons.disable=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c pointEdit.buttons.restart=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c -pointEdit.buttons.note=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 +pointEdit.buttons.note=\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 pointEdit.chart.props=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 pointEdit.chart.type=\u0422\u0438\u043f @@ -1551,7 +1551,7 @@ pointHierarchySLTS.dataSource=Data source pointHierarchySLTS.xid=XID pointHierarchySLTS.type=Type pointHierarchySLTS.changeOfLanguageFailed=Change of language failed -pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don't remove data point in root hierarchy +pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don’t remove data point in root hierarchy pointHierarchySLTS.moveDataPointToRoot=Move the element to root level tree pointHierarchySLTS.areYouSureToMoveElement=Are you sure to move element? pointHierarchySLTS.movedElement=Moved element @@ -1752,7 +1752,7 @@ scheduledEvents.validate.inactiveTrigger=\u041e\u0448\u0438\u0431\u043a\u0430 \u scheduledEvents.validate.aliasTooLong=\u0414\u043b\u0438\u043d\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 50 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 scheduledEvents.validate.invalidRtn=\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f -sql.warning=\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u044d\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0432\u0430\u0448 \u0441\u0442\u0440\u0430\u0445 \u0438 \u0440\u0438\u0441\u043a. \u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438/\u0438\u043b\u0438 \u0441\u0431\u043e\u044f\u043c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. +sql.warning= \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u044d\u0442\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0432\u0430\u0448 \u0441\u0442\u0440\u0430\u0445 \u0438 \u0440\u0438\u0441\u043a. \u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u043e\u0442\u0435\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438/\u0438\u043b\u0438 \u0441\u0431\u043e\u044f\u043c \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. sql.sql=SQL sql.query=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 sql.update=\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 @@ -1770,8 +1770,8 @@ systemSettings.upToDate=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u systemSettings.emailSettings=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 systemSettings.smtpHost=\u0425\u043e\u0441\u0442 SMTP systemSettings.smtpPort=\u041f\u043e\u0440\u0442 SMTP -systemSettings.fromAddress=\u0410\u0434\u0440\u0435\u0441 \u0432 \u043f\u043e\u043b\u0435 'From:' -systemSettings.fromName=\u0418\u043c\u044f \u0432 \u043f\u043e\u043b\u0435 'From:' +systemSettings.fromAddress=\u0410\u0434\u0440\u0435\u0441 \u0432 \u043f\u043e\u043b\u0435 ’From:’ +systemSettings.fromName=\u0418\u043c\u044f \u0432 \u043f\u043e\u043b\u0435 ’From:’ systemSettings.auth=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e systemSettings.smtpUsername=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f systemSettings.smtpPassword=\u041f\u0430\u0440\u043e\u043b\u044c @@ -1930,7 +1930,7 @@ viewEdit.compound.duration=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u044 views.title=\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u0438\u0434\u044b views.newView=\u041d\u043e\u0432\u044b\u0439 \u0432\u0438\u0434 -views.noViews=\u0412\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u0441\u0435\u0439\u0447\u0430\u0441. +views.noViews=\u0412\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u0438\u0434\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 watchlist.addToWatchlist=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043b\u0438\u0441\u0442 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f watchlist.points=\u0422\u043e\u0447\u043a\u0438 @@ -2030,7 +2030,7 @@ event.system.process=\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u0440\u04 event.audit.added=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c "{0}" \u0441\u043e\u0437\u0434\u0430\u043b {1} \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c {2}: {3} event.audit.changed=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c "{0}" \u0438\u0437\u043c\u0435\u043d\u0438\u043b {1} \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c {2}: {3} -event.audit.changedProperty=
    {0}: "{1}" \u0432 "{2}" +event.audit.changedProperty={0}: "{1}" \u0432 "{2}" event.audit.compoundEventDetector=\u0421\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 event.audit.dataPoint=\u0422\u043e\u0447\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 event.audit.dataSource=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 @@ -2039,7 +2039,7 @@ event.audit.eventHandler=\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\ event.audit.maintenanceEvent=\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f event.audit.pointEventDetector=\u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 event.audit.pointLink=\u0421\u0432\u044f\u0437\u044c \u0442\u043e\u0447\u0435\u043a -event.audit.property=
    {0}="{1}" +event.audit.property={0}="{1}" event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2384,7 +2384,7 @@ emport.error.eventCode=\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u0 emport.error.alarmLevel=\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0442\u0440\u0435\u0432\u043e\u0433\u0438 ''{0}'' \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f ''{1}''. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: {2} emport.error.missingUser=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441 \u0438\u043c\u0435\u043d\u0435\u043c ''{0}'' \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d emport.error.viewShare.missing=\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 ''{0}'' \u0432 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0438\u0434\u0430 -emport.error.component.incompatibleDataType=\u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0438 \u0441 'XID' ''{0}'' \u043d\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 \u0442\u0438\u043f\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u0438\u0434\u0430 ''{1}'' +emport.error.component.incompatibleDataType=\u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u0447\u043a\u0438 \u0441 ’XID’ ''{0}'' \u043d\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 \u0442\u0438\u043f\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u0438\u0434\u0430 ''{1}'' emport.error.compound.invalidChildId=\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 ''{0}'' \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u0442\u0438\u043f\u0430 ''{1}''. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b: {2} emport.error.component.unknownDynamicImage=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f ''{0}'' \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439: {1} emport.error.component.unknownImageSet=\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0430\u0431\u043e\u0440\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 ''{0}'' \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d. \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0430\u0431\u043e\u0440\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439: {1} @@ -2600,8 +2600,8 @@ engUnit.188=\u041d\u044c\u044e\u0442\u043e\u043d \u043d\u0430 \u043c\u0435\u0442 engUnit.189=\u0412\u0430\u0442\u0442\u044b \u043d\u0430 \u043c\u0435\u0442\u0440-\u043a\u0435\u043b\u044c\u0432\u0438\u043d engUnit.190=kilometers -engUnit.abbr.0=\u043c2 -engUnit.abbr.1=\u04442 +engUnit.abbr.0=\u043c\u00b2 +engUnit.abbr.1=\u0444\u00b2 engUnit.abbr.2=\u043c\u0410 engUnit.abbr.3=\u0410 engUnit.abbr.4=\u041e\u043c @@ -3487,4 +3487,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor +pointEdit.buttons.note.prefix=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: +sql.warning.prefix=\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435: +views.noViews.prefix=\u0441\u0435\u0439\u0447\u0430\u0441. annotation.api=REST API +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/messages_zh.properties b/test/messages_zh.properties index 15021411d6..33ab4c2c56 100644 --- a/test/messages_zh.properties +++ b/test/messages_zh.properties @@ -581,7 +581,7 @@ dsEdit.meta.event.week=\u5f00\u59cb\u7684\u5468\u6570 dsEdit.meta.event.month=\u5f00\u59cb\u6708\u4efd dsEdit.meta.event.year=\u5f00\u59cb\u5e74\u4efd dsEdit.meta.event.cron=\u5b9a\u65f6\u5668\u8868\u8fbe\u5f0f -dsEdit.meta.delay=\u6267\u884c\u5ef6\u65f6
+dsEdit.meta.delay=\u6267\u884c\u5ef6\u65f6 dsEdit.meta.test.success=\u6210\u529f\u3002\u7ed3\u679c={0} dsEdit.meta.test.successTs=\u6210\u529f\u3002\u7ed3\u679c={0}\uff0c\u65f6\u95f4\u6233={1} dsEdit.meta.test.context=\u4e00\u4e2a\u6216\u8005\u591a\u4e2a\u70b9\u5df2\u5931\u6548\u6216\u8005\u4e0d\u5b58\u5728 @@ -899,31 +899,31 @@ emport.importProgress=\u6b63\u5728\u5bfc\u5165... emport.importCancelled=\u5bfc\u5165\u5df2\u53d6\u6d88 emport.importComplete=\u5bfc\u5165\u5b8c\u6210 emport.noMessages=\u65e0\u8fd4\u56de\u4fe1\u606f\u3002\u65e0\u9700\u5bfc\u5165? -emport.invalidImportData=\u5bfc\u5165\u6570\u636e\u65e0\u6548: \u975eJSON\u5bf9\u8c61 +emport.invalidImportData=\u5bfc\u5165\u6570\u636e\u65e0\u6548: \u975eJSON\u5bf9\u8c61. (www.json.org) emport.parseError=JSON\u5bf9\u8c61\u5206\u6790\u9519\u8bef: {0} emport.user.username=\u7528\u6237\u7f3a\u5c11'\u7528\u6237\u540d'\u3002\u5df2\u5ffd\u7565\u3002 emport.user.prefix=\u7528\u6237 ''{0}'': {1} -emport.view.missingType=View with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} -emport.dataSource.xid=A\u6570\u636e\u6e90 with name ''{0}'' does not have an 'xid' value. Ignored. -emport.dataSource.missingType=\u6570\u636e\u6e90 with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} -emport.dataSource.invalidType="\u6570\u636e\u6e90 with XID ''{0}'' does not already exist and has an invalid 'type' value of ''{1}''. Valid types are {2} +emport.view.missingType=View with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} +emport.dataSource.xid=A\u6570\u636e\u6e90 with name ''{0}'' does not have an ’xid’ value. Ignored. +emport.dataSource.missingType=\u6570\u636e\u6e90 with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} +emport.dataSource.invalidType="\u6570\u636e\u6e90 with XID ''{0}'' does not already exist and has an invalid ’type’ value of ''{1}''. Valid types are {2} emport.dataSource.prefix=\u6570\u636e\u6e90 ''{0}'': {1} -emport.dataPoint.xid=A \u6570\u636e\u70b9with name ''{0}'' does not have an 'xid' value. Ignored. +emport.dataPoint.xid=A \u6570\u636e\u70b9with name ''{0}'' does not have an ’xid’ value. Ignored. emport.dataPoint.badReference=\u6570\u636e\u70b9with XID ''{0}'' does not already exist and references a\u6570\u636e\u6e90 that does not exist. Ignored. emport.dataPoint.prefix=\u6570\u636e\u70b9''{0}'': {1} emport.userPermission.prefix=Permissions for user ''{0}'': {1} emport.added=added emport.saved=saved emport.causedBy=caused by: -emport.view.xid=A graphical view does not have an 'xid' value. Ignored. +emport.view.xid=A graphical view does not have an ’xid’ value. Ignored. emport.view.prefix=View ''{0}'': {1} emport.pointHierarchy.prefix=\u70b9\u5c42\u6b21: {0} -emport.pointLink.xid=A \u70b9\u94fe\u63a5does not have an 'xid' value. Ignored. +emport.pointLink.xid=A \u70b9\u94fe\u63a5does not have an ’xid’ value. Ignored. emport.pointLink.prefix=\u70b9\u94fe\u63a5''{0}'': {1} -eventHandlers.recipTestEmailMessage=\u8fd9\u662f\u6d4b\u8bd5\u90ae\u4ef6\u5173\u4e8e\u4e8b\u4ef6\u5904\u7406\u5668's email recipient list +eventHandlers.recipTestEmailMessage=\u8fd9\u662f\u6d4b\u8bd5\u90ae\u4ef6\u5173\u4e8e\u4e8b\u4ef6\u5904\u7406\u5668’s email recipient list eventHandlers.emailRecipients=Email recipients -eventHandlers.escalTestEmailMessage=\u8fd9\u662f\u6d4b\u8bd5\u90ae\u4ef6\u5173\u4e8e\u4e8b\u4ef6\u5904\u7406\u5668's escalation list +eventHandlers.escalTestEmailMessage=\u8fd9\u662f\u6d4b\u8bd5\u90ae\u4ef6\u5173\u4e8e\u4e8b\u4ef6\u5904\u7406\u5668’s escalation list eventHandlers.escalRecipients=Escalation recipients eventHandlers.noEmailRecips=You must add email recipients eventHandlers.escalDelayError=Escalation delay\u5fc5\u987b\u5927\u4e8e0 @@ -1029,8 +1029,7 @@ login.loginButton=\u767b\u5f55 login.unknownBrowser=\u8bf7\u68c0\u67e5\u60a8\u6d4f\u89c8\u5668\u7684\u517c\u5bb9\u6027... login.supportedBrowser=\u672c\u6d4f\u89c8\u5668\u662f\u5b98\u65b9\u652f\u6301\u7684\u3002 login.unsupportedBrowser=\u60a8\u7684\u6d4f\u89c8\u5668\u53ef\u80fd\u53ef\u4ee5\u6d4f\u89c8\u672c\u7ad9\uff0c\u4f46\u5b83\u4e0d\u662fserosoft\u8f6f\u4ef6\u516c\u53f8\u5b98\u65b9\u652f\u6301\u7684\u6d4f\u89c8\u5668 \u3002\ -\u6211\u4eec\u63a8\u8350\u60a8\u4f7f\u7528 \u706b\u72d0(Firefox), Chrome, \u6216\u8005 \ -\u5fae\u8f6f\u7684Internet Explorer 7. +\u6211\u4eec\u63a8\u8350\u60a8\u4f7f\u7528 Mozilla Firefox, Google Chrome. login.nag=\u6ce8\u610f: \u7531\u4e8e\u60a8\u4f7f\u7528\u7684\u6d4f\u89c8\u5668\u4e0d\u5728\u5b98\u65b9\u652f\u6301\u7684\u8303\u56f4\u5185\uff0c\u6240\u4ee5\u8bbf\u95ee\u672c\u7ad9\u53ef\u80fd\u9047\u5230\u4e00\u4e9b\u95ee\u9898\u3002\u8bf7\u5347\u7ea7\u6216\u8005\u66f4\u6362\u6d4f\u89c8\u5668\u3002 mailingLists.added=\u90ae\u4ef6\u5217\u8868\u5df2\u589e\u52a0 @@ -1062,7 +1061,7 @@ notes.cancel=\u653e\u5f03 notes.timeByUsername=time\u6839\u636e\u7528\u6237\u540d notification.newui.title=New page is available! notification.newui.move=Move! -notification.newui.dontshow=Don't show again. +notification.newui.dontshow=Don’t show again. pointDetails.recordCountError=\u8bb0\u5f55\u6570\u5fc5\u987b\u662f\u4e00\u4e2a\u6570\u5b57 pointDetails.timePeriodError=\u65f6\u95f4\u95f4\u9694\u5fc5\u987b\u662f\u4e00\u4e2a\u6570\u5b57 pointDetails.imageCountError=\u6570\u904d\u6570\u5fc5\u987b\u662f\u4e00\u4e2a\u6570\u5b57 @@ -1098,7 +1097,7 @@ pointDetails.accessType=\u8bbf\u95ee\u7c7b\u578b pointEdit.buttons.enable=\u6fc0\u6d3b pointEdit.buttons.disable=\u7981\u7528 pointEdit.buttons.restart=\u91cd\u542f -pointEdit.buttons.note=\u6ce8\u610f: \u4fdd\u5b58\u3001\u7981\u7528\u3001\u91cd\u542f\u70b9\u5c06\u4f7f\u5176\u544a\u8b66\u4e8b\u4ef6\u7ea7\u522b\u53d8\u4e3a\u666e\u901a +pointEdit.buttons.note=\u4fdd\u5b58\u3001\u7981\u7528\u3001\u91cd\u542f\u70b9\u5c06\u4f7f\u5176\u544a\u8b66\u4e8b\u4ef6\u7ea7\u522b\u53d8\u4e3a\u666e\u901a pointEdit.chart.props=\u56fe\u8868\u6e32\u67d3\u5668\u5c5e\u6027 pointEdit.chart.type=\u7c7b\u578b @@ -1248,7 +1247,7 @@ pointHierarchySLTS.dataSource=Data source pointHierarchySLTS.xid=XID pointHierarchySLTS.type=Type pointHierarchySLTS.changeOfLanguageFailed=Change of language failed -pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don't remove data point in root hierarchy +pointHierarchySLTS.warningDontRemoveDataPointInRoot=Don’t remove data point in root hierarchy pointHierarchySLTS.moveDataPointToRoot=Move the element to root level tree pointHierarchySLTS.areYouSureToMoveElement=Are you sure to move element? pointHierarchySLTS.movedElement=Moved element @@ -1412,7 +1411,7 @@ scheduledEvents.validate.activeTrigger=\u521b\u5efaactive\u89e6\u53d1\u5668\u65f scheduledEvents.validate.inactiveTrigger=\u521b\u5efainactive\u89e6\u53d1\u5668\u65f6\u53d1\u751f\u9519\u8bef\uff1a{0} scheduledEvents.validate.aliasTooLong=\u522b\u540d\u4e0d\u80fd\u8d85\u8fc750\u5b57\u7b26 -sql.warning=\u8b66\u544a\uff1a \u4f7f\u7528\u672c\u5de5\u5177\u98ce\u9669\u81ea\u62c5\u3002\u4f7f\u7528\u65b9\u6cd5\u4e0d\u5f97\u5f53\u5c06\u53ef\u80fd\u5bfc\u81f4\u635f\u574f\u7684\u6570\u636e\u6216\u8005\u7cfb\u7edf\u7ea7\u522b\u7684\u9519\u8bef\u3002(\u539f\u56e0\u662fSQL\u76f4\u63a5\u4f5c\u7528\u4e8e\u6570\u636e\u5e93) +sql.warning= \u4f7f\u7528\u672c\u5de5\u5177\u98ce\u9669\u81ea\u62c5\u3002\u4f7f\u7528\u65b9\u6cd5\u4e0d\u5f97\u5f53\u5c06\u53ef\u80fd\u5bfc\u81f4\u635f\u574f\u7684\u6570\u636e\u6216\u8005\u7cfb\u7edf\u7ea7\u522b\u7684\u9519\u8bef\u3002(\u539f\u56e0\u662fSQL\u76f4\u63a5\u4f5c\u7528\u4e8e\u6570\u636e\u5e93) sql.sql=SQL sql.query=\u63d0\u4ea4\u67e5\u8be2 sql.update=\u63d0\u4ea4\u66f4\u65b0 @@ -1579,7 +1578,7 @@ viewEdit.compound.duration=\u671f\u95f4 views.title=\u56fe\u5f62\u5316\u89c6\u56fe views.newView=\u65b0\u5efa\u89c6\u56fe -views.noViews=\u672a\u521b\u5efa\u56fe\u5f62\u5316\u89c6\u56fe. \u9a6c\u4e0a\u521b\u5efa. +views.noViews=\u672a\u521b\u5efa\u56fe\u5f62\u5316\u89c6\u56fe. viewEdit.viewDelete=Delete view: viewEdit.viewDeleteConfirm=Confirm @@ -1678,7 +1677,7 @@ event.system.pointLink=\u70b9\u7684\u94fe\u63a5\u5931\u8d25 event.audit.added=\u7528\u6237 "{0}" \u5df2\u88ab\u521b\u5efa {1} \u83b7\u5f97\u6807\u8bc6\u4e3a {2}: {3} event.audit.changed=\u7528\u6237 "{0}" \u5df2\u88ab\u66f4\u6539 {1} \u5176\u6807\u8bc6\u4e3a {2}: {3} -event.audit.changedProperty=
    {0}: "{1}" -> "{2}" +event.audit.changedProperty={0}: "{1}" -> "{2}" event.audit.compoundEventDetector=\u7ec4\u5408\u4e8b\u4ef6\u4fa6\u5bdf\u5668 event.audit.dataPoint=\u6570\u636e\u70b9 event.audit.dataSource=\u6570\u636e\u6e90 @@ -1687,7 +1686,7 @@ event.audit.eventHandler=\u4e8b\u4ef6\u5904\u7406\u5668 event.audit.maintenanceEvent=Maintenance event event.audit.pointEventDetector=\u70b9\u4e8b\u4ef6\u4fa6\u5bdf\u5668 event.audit.pointLink=\u70b9\u7684\u94fe\u63a5 -event.audit.property=
    {0}="{1}" +event.audit.property={0}="{1}" event.audit.propertyList.0= event.audit.propertyList.1={0} event.audit.propertyList.10={0}{1}{2}{3}{4}{5}{6}{7}{8}{9} @@ -2003,7 +2002,7 @@ emport.error.eventCode=\u65e0\u6548\u7684\u4e8b\u4ef6\u4ee3\u7801''{0}''\u3002\u emport.error.alarmLevel=\u4e8b\u4ef6''{1}''\u7684\u65e0\u6548\u544a\u8b66\u7ea7\u522b''{0}''\u3002\u65e0\u6548\u503c\u4e3a\uff1a{2} emport.error.missingUser=\u53eb''{0}''\u540d\u5b57\u7684\u7528\u6237\u6ca1\u6709\u627e\u5230 emport.error.viewShare.missing=\u89c6\u56fe\u5171\u4eab\u4e2d\u6ca1\u6709''{0}'' -emport.error.component.incompatibleDataType='XID'\u4e3a''{0}''\u7684\u6570\u636e\u70b9\u7684\u5c5e\u6027\u7c7b\u578b\u4e0e\u6570\u636e\u7c7b\u578b''{1}''\u4e0d\u5339\u914d +emport.error.component.incompatibleDataType=’XID’\u4e3a''{0}''\u7684\u6570\u636e\u70b9\u7684\u5c5e\u6027\u7c7b\u578b\u4e0e\u6570\u636e\u7c7b\u578b''{1}''\u4e0d\u5339\u914d emport.error.compound.invalidChildId=\u7c7b\u578b\u4e3a''{1}''\u7684\u7ec4\u5408\u89c6\u56fe\u7ec4\u4ef6\u7684\u5b50id''{0}''\u65e0\u6548\u3002\u6709\u6548\u7684id\u4e3a\uff1a{2} emport.error.component.unknownDynamicImage=id\u4e3a''{0}''\u7684\u52a8\u6001\u56fe\u6ca1\u6709\u53d1\u73b0\u3002\u5df2\u77e5\u7684\u52a8\u6001\u56feid\u5982\u4e0b\uff1a{1} emport.error.component.unknownImageSet=id\u4e3a''{0}''\u7684\u56fe\u7247\u96c6\u5408\u6ca1\u6709\u53d1\u73b0\u3002\u5df2\u77e5\u7684\u56fe\u7247\u96c6\u5408id\u5982\u4e0b\uff1a{1} @@ -2450,7 +2449,7 @@ publisherEdit.persistent.status.connectionState=Connection\: {0} emport.maintenanceEvent.prefix=Maintenance event ''{0}''\: {1} dox.internalDS=Internal Data Source systemSettings.instanceId=Instance ID -dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee
firmware
revision +dsEdit.viconics.zigbeeFirmwareRevisionBr=Zigbee firmware revision eventHandlers.activeScript=When active script dsEdit.mbus.addressHex=Address dsEdit.mbus.manufacturer=Manufacturer @@ -2488,9 +2487,9 @@ engUnit.abbr.5=V engUnit.abbr.4=ohms engUnit.abbr.3=A engUnit.abbr.2=mA -engUnit.abbr.1=f2 +engUnit.abbr.1=ft\u00b2 graphic.enhancedImageChart.pointConfig.showPoints=Display points of measure\: -engUnit.abbr.0=m2 +engUnit.abbr.0=m\u00b2 scripts.objectsContext=Context objects dsEdit.radiuino.radiuinoDataType.2bUnsigned=Integer (unsigned 2 bytes) dsEdit.iec101Ethernet=IEC101 Ethernet @@ -2508,7 +2507,7 @@ event.pachube.dataStreamNotFound=Data stream "{0}" in feed {1} not found or has dsEdit.asciiSerial.timeout=Timeout (ms) dsEdit.openv4j.dataPointSettable=Setable maintenanceEvents.addMe=Add maintenance event -emport.publisher.xid=A data source with name ''{0}'' does not have an 'xid' value. Ignored. +emport.publisher.xid=A data source with name ''{0}'' does not have an ’xid’ value. Ignored. dsEdit.asciiSerial=ASCII Serial dsEdit.mbus.firstHexAddress=From Address (Hex) dsEdit.modbusIp.socketPointName=TCP socket monitoring @@ -2604,7 +2603,7 @@ publisherEdit.persistent.startSync=Synchronize history dsEdit.radiuino.desc=Radiuino Properties graphic.button=ON/OFF Button dsEdit.openv4j.device=Device -dsEdit.viconics.chipRevisionBr=Chip
revision +dsEdit.viconics.chipRevisionBr=Chip revision dox.importProject=Importing projects events.search.maxResults=Max results dox.pachubeDS=Pachube data source @@ -2664,7 +2663,7 @@ publisherEdit.pachube.retries=Retries maintenanceEvents.schedule.manual={0} - Manual dsEdit.persistent.dsconn=Port\: {0} emport.error.eventType.missing.reference=Event type must have a ''{0}'' -dsEdit.viconics.firmwareRevision=Firmware
revision +dsEdit.viconics.firmwareRevision=Firmware revision pointEdit.props.deviceName=Device Name dsEdit.alpha2.station=Station dsEdit.dnp3.minIndex=Min index @@ -2863,7 +2862,7 @@ engUnit.abbr.133=hectopascals engUnit.abbr.132=milliwatts engUnit.abbr.131=per hour engUnit.abbr.130=megahertz -emport.compoundEvent.xid=A compound event detector does not have an 'xid' value. Ignored. +emport.compoundEvent.xid=A compound event detector does not have an ’xid’ value. Ignored. engUnit.139=megajoules per square meter engUnit.138=kilowatt hours per square foot engUnit.137=kilowatt hours per square meter @@ -3072,11 +3071,11 @@ engUnit.41=tons dsEdit.dnp3.validate.indexUsed=Index already in use engUnit.40=pounds mass publisherEdit.pachube.point.feedId=Feed ID -emport.publisher.invalidType=Publisher with XID ''{0}'' does not already exist and has an invalid 'type' value of ''{1}''. Valid types are {2} +emport.publisher.invalidType=Publisher with XID ''{0}'' does not already exist and has an invalid ’type’ value of ''{1}''. Valid types are {2} dsEdit.pachube.timeout=Timeout (seconds) common.confirmDelete=Are you sure you want delete? dsEdit.modbus.maxReadBitCount=Max read bit count -dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee
network
address +dsEdit.viconics.zigbeeNetworkAddressBr=Zigbee network address scripts.seDetails=Script details dsedit.opc.tagName=Tag Tag dsEdit.modbus.modbusDataType.varchar=Variable length string @@ -3169,7 +3168,7 @@ dsEdit.opc=OPC DA dsEdit.drStorageHt5b.pointType=Point Type events.listed={0} event(s) listed events.ackedByDeletedUser=- (deleted user) -eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler's inactive list +eventHandlers.inactiveTestEmailMessage=This message was sent as a test of an event handler’s inactive list dsEdit.jmx.addPoint=Add point dsEdit.asciiSerial.charStopMode.charASCII=ASCII character dsEdit.radiuino.offset=Offset @@ -3178,7 +3177,7 @@ dsEdit.openv4j.desc=OpenV4J properties userProfiles.validate.successDeleting=Profile successfully deleted. dsEdit.alpha2.deviceCode.commWordDevice=Comm Word Device dox.asciiFileReaderPP=ASCII File Reader PP -emport.mailingList.xid=A mailing list does not have an 'xid' value. Ignored. +emport.mailingList.xid=A mailing list does not have an ’xid’ value. Ignored. aphic.simpleCompound.leadPoint=Lead Point graphic.enhancedPoint=Enhanced point maintenanceEvents.meDisabled=Disabled maintenance event @@ -3212,7 +3211,7 @@ dsEdit.internal.attr.BATCH_ENTRIES=Point values to be written event.pb.persistent.syncCompleted=Synchronization completed publisherEdit.httpSender.dateFormat=Date format scripts.se=Script -emport.watchList.xid=A watch list does not have an 'xid' value. Ignored. +emport.watchList.xid=A watch list does not have an ’xid’ value. Ignored. systemSettings.contentType.html=HTML only dsEdit.mbus.search=Search dsEdit.opc.validate.dataSourceNotSaved=You must first save the data source @@ -3232,14 +3231,14 @@ dox.scriptDPObject=Data Point Context Object dox.opcDS=Data Source OPC dsEdit.modbus.locatorTestIp.startError=There was a problem testing the locator. ({0}) publisherEdit.persistent=Serotonin Persistent TCP -dsEdit.viconics.commAddress=Comm
address +dsEdit.viconics.commAddress=Comm address dsEdit.openv4j.dataPoint=Datapoint dsEdit.mbus.addPoint=add validate.between=Must be between {0} and {1} dsEdit.iec101.dpconn=TypeId {0}, IOA {1} dsEdit.jmx.attributeNotComposite=Attribute ''{0}'' in ''{1}'' is not composite maintenanceEvents.validate.inactiveCron=Error in inactive cron expression\: {0} -emport.scheduledEvent.xid=A scheduled event does not have an 'xid' value. Ignored. +emport.scheduledEvent.xid=A scheduled event does not have an ’xid’ value. Ignored. emport.error.eventHandler.invalid=Event handler has an invalid ''{0}'' value of ''{1}''. Valid values are {2} dsEdit.viconics.channel=Channel dsEdit.mbus.useDirectConnection=Direct connection @@ -3302,7 +3301,7 @@ dsEdit.mbus.vifeLabels=Vife labels pointDetails.pointNotFound=Point not found dsEdit.asciiSerial.baud=Baud rate dox.radiuinoPP=Radiuino data point -emport.eventHandler.xid=A point link does not have an 'xid' value. Ignored. +emport.eventHandler.xid=A point link does not have an ’xid’ value. Ignored. dsEdit.bacnetIp.objectList=Device object list dsEdit.mbus.responseFrame=Frame engUnitGroup.length=Length @@ -3330,7 +3329,7 @@ dsEdit.modbus.dpconn3=Connection monitoring dsEdit.modbus.dpconn2=Slave id {0} monitor graphic.enhancedImageChart.pointConfig.renderMode=Render mode\: dsEdit.serial.parity.space=Space -emport.maintenanceEvent.xid=A maintenance event does not have an 'xid' value. Ignored. +emport.maintenanceEvent.xid=A maintenance event does not have an ’xid’ value. Ignored. dsEdit.openv4j.refreshStopped=Update finished dsEdit.internal.attr.MONITOR_STACK_HEIGHT=Maximum thread stack height dsEdit.viconics.port=Port @@ -3368,7 +3367,7 @@ dsEdit.opc.tagName=Tag Name graphic.link=Link eventHandlers.inactiveOverride=Override inactive recipients dsEdit.bacnetIp.remoteDeviceNetworkNumber=Network Number -emport.publisher.missingType=Publisher with XID ''{0}'' does not already exist and does not have a 'type' value. Valid types are {1} +emport.publisher.missingType=Publisher with XID ''{0}'' does not already exist and does not have a ’type’ value. Valid types are {1} dsEdit.alpha2.deviceCode.commBitDevice=Comm Bit Device dsEdit.mbus.tcpIpBitPerSecond=Baudrate dox.jmxDS=JMX Data Source @@ -3380,7 +3379,7 @@ maintenanceEvents.toggle.disabled=Cannot toggle. Event is currently disabled. maintenanceEvents.validate.activeCron=Error in active cron expression\: {0} dsEdit.bacnetIp.remoteDeviceInstanceNumber=Remote device instance number dsEdit.nodaves7.s7writeBytesQty=Bytes quantity -emport.versionError=The project version ({0}) isn't compatible with current system version ({1}) +emport.versionError=The project version ({0}) isn’t compatible with current system version ({1}) publisherEdit.persistent.sync.none=None dsEdit.dnp3Serial.baud=Baud rate eventHandlers.noInactiveRecips=You must add inactive recipients @@ -3409,7 +3408,7 @@ dsEdit.asciiFile.checkFile=Check event.persistent.xidTooLong=XID of "{0}" point is too long. event.viconics.duplicateCommException=Duplicate comm address detected\: {0} dsEdit.drStorageHt5b.type.Temperature=Temperature -dsEdit.viconics.modelNumber=Model
number +dsEdit.viconics.modelNumber=Model number dsEdit.dnp3.binaryInput=Binary Input dsEdit.jmx.getObjectNames=Get object names dox.colours=Color @@ -3440,4 +3439,16 @@ systemsettings.webresource.graphics.path=Graphics images path systemsettings.webresource.uploads.path.wrong=Uploaded images save path must end with "uploads" or "uploads{0}" systemsettings.webresource.graphics.path.wrong=Graphics images path must end with "graphics" or "graphics{0}" event.ds.monitorWrite=Monitor write exception +dsEdit.mbus.correctionFactor=Correction factor +pointEdit.buttons.note.prefix=\u6ce8\u610f: +sql.warning.prefix=\u8b66\u544a\uff1a: +views.noViews.prefix=\u9a6c\u4e0a\u521b\u5efa. annotation.api=REST API +dsEdit.sql.statementLimit=Statement limit +dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? +event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" +event.script.failure=Failed execute script: "{0}", Message: "{1}" +event.system.sms=Sms send failure +event.system.script=Script event handler failure +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/test/utils/ScriptTestUtils.java b/test/utils/ScriptTestUtils.java index b0a050abcf..e9a51fd4ac 100644 --- a/test/utils/ScriptTestUtils.java +++ b/test/utils/ScriptTestUtils.java @@ -7,12 +7,14 @@ import com.serotonin.mango.rt.dataImage.DataPointRT; import com.serotonin.mango.rt.dataImage.PointValueTime; import com.serotonin.mango.rt.dataImage.types.MangoValue; +import com.serotonin.mango.rt.dataSource.DataSourceRT; import com.serotonin.mango.vo.DataPointVO; import com.serotonin.mango.vo.DataPointVO.LoggingTypes; import com.serotonin.mango.vo.User; import com.serotonin.mango.vo.dataSource.PointLocatorVO; import com.serotonin.mango.vo.dataSource.virtual.VirtualPointLocatorVO; import com.serotonin.mango.vo.permission.Permissions; +import org.mockito.Mockito; import org.scada_lts.web.beans.ApplicationBeans; import org.scada_lts.web.ws.services.DataPointServiceWebSocket; import utils.mock.MockUtils; @@ -72,4 +74,10 @@ public static void configMock(RuntimeManager runtimeManager, ScriptContextObject when(ApplicationBeans.getDataPointServiceWebSocketBean()).thenReturn(dataPointServiceWebSocket); } + public static void configScriptMock(RuntimeManager runtimeManager, ScriptContextObject scriptContextObject) throws Exception { + DataSourceRT dataSourceRT = mock(DataSourceRT.class); + Mockito.when(dataSourceRT.isInitialized()).thenReturn(true); + Mockito.when(runtimeManager.getRunningDataSource(anyInt())).thenReturn(dataSourceRT); + ScriptTestUtils.configMock(runtimeManager, scriptContextObject); + } } diff --git a/webapp-resources/log4j2.xml b/webapp-resources/log4j2.xml index c59525cb10..9ee9407832 100644 --- a/webapp-resources/log4j2.xml +++ b/webapp-resources/log4j2.xml @@ -249,6 +249,13 @@
+ + + + + + + diff --git a/webapp-resources/messages_de.properties b/webapp-resources/messages_de.properties index c8988ebc27..cf9b9a22a7 100644 --- a/webapp-resources/messages_de.properties +++ b/webapp-resources/messages_de.properties @@ -3347,4 +3347,5 @@ event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure -validate.valueRestored=Previous value restored \ No newline at end of file +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/webapp-resources/messages_en.properties b/webapp-resources/messages_en.properties index 89b0024071..db04560d04 100644 --- a/webapp-resources/messages_en.properties +++ b/webapp-resources/messages_en.properties @@ -3350,4 +3350,5 @@ event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure -validate.valueRestored=Previous value restored \ No newline at end of file +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/webapp-resources/messages_es.properties b/webapp-resources/messages_es.properties index 206bbe4a1e..2ca2afdf82 100644 --- a/webapp-resources/messages_es.properties +++ b/webapp-resources/messages_es.properties @@ -3390,4 +3390,5 @@ event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure -validate.valueRestored=Previous value restored \ No newline at end of file +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/webapp-resources/messages_fi.properties b/webapp-resources/messages_fi.properties index 02dd8b0b0a..68419a159b 100644 --- a/webapp-resources/messages_fi.properties +++ b/webapp-resources/messages_fi.properties @@ -3475,4 +3475,5 @@ event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure -validate.valueRestored=Previous value restored \ No newline at end of file +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/webapp-resources/messages_fr.properties b/webapp-resources/messages_fr.properties index eafb7118c5..0d78c21ea5 100644 --- a/webapp-resources/messages_fr.properties +++ b/webapp-resources/messages_fr.properties @@ -3344,4 +3344,5 @@ event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure -validate.valueRestored=Previous value restored \ No newline at end of file +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/webapp-resources/messages_lu.properties b/webapp-resources/messages_lu.properties index 138614a8f8..d46be3fc4d 100644 --- a/webapp-resources/messages_lu.properties +++ b/webapp-resources/messages_lu.properties @@ -3357,7 +3357,6 @@ annotation.api=REST API pointEdit.buttons.note.prefix=Hinweis: sql.warning.prefix=Warnung: views.noViews.prefix=elo. -annotation.api=REST API dsEdit.sql.statementLimit=Statement limit dsEdit.sql.statementLimit.warning=Setting the value 0 in the Statement limit field means there is no limit for the select query, which may lead to a serious application failure due to filling up the memory needed for the application to run. Do you confirm setting Statement limit equals 0? event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" @@ -3365,3 +3364,4 @@ event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/webapp-resources/messages_nl.properties b/webapp-resources/messages_nl.properties index 37b6329cc4..b88d94b018 100644 --- a/webapp-resources/messages_nl.properties +++ b/webapp-resources/messages_nl.properties @@ -3465,4 +3465,5 @@ event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure -validate.valueRestored=Previous value restored \ No newline at end of file +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/webapp-resources/messages_pl.properties b/webapp-resources/messages_pl.properties index 3d33f3ebab..fe996d18cf 100644 --- a/webapp-resources/messages_pl.properties +++ b/webapp-resources/messages_pl.properties @@ -3488,3 +3488,4 @@ event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/webapp-resources/messages_pt.properties b/webapp-resources/messages_pt.properties index 5127d9ca5b..22b4325781 100644 --- a/webapp-resources/messages_pt.properties +++ b/webapp-resources/messages_pt.properties @@ -3502,4 +3502,5 @@ event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure -validate.valueRestored=Previous value restored \ No newline at end of file +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/webapp-resources/messages_ru.properties b/webapp-resources/messages_ru.properties index ee2a6c3703..aa0dc3aa32 100644 --- a/webapp-resources/messages_ru.properties +++ b/webapp-resources/messages_ru.properties @@ -3498,4 +3498,5 @@ event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure -validate.valueRestored=Previous value restored \ No newline at end of file +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file diff --git a/webapp-resources/messages_zh.properties b/webapp-resources/messages_zh.properties index 39fdbecb57..33ab4c2c56 100644 --- a/webapp-resources/messages_zh.properties +++ b/webapp-resources/messages_zh.properties @@ -3450,4 +3450,5 @@ event.sms.failure=Failed to send sms titled "{0}" to "{1}". Message: "{2}" event.script.failure=Failed execute script: "{0}", Message: "{1}" event.system.sms=Sms send failure event.system.script=Script event handler failure -validate.valueRestored=Previous value restored \ No newline at end of file +validate.valueRestored=Previous value restored +validate.invalidVariable=Invalid variable: {0} \ No newline at end of file From add937b0df63005d8f46050403a5e9b880ee53b1 Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Fri, 30 Aug 2024 17:05:18 +0200 Subject: [PATCH 25/63] #2755 Signaling the Data Source that has a problem: - fixed alarmAck.tag for new event type; - fixed double actions for eventList.jsp; --- WebContent/WEB-INF/snippet/eventList.jsp | 67 ------------------------ WebContent/WEB-INF/tags/alarmAck.tag | 4 ++ 2 files changed, 4 insertions(+), 67 deletions(-) diff --git a/WebContent/WEB-INF/snippet/eventList.jsp b/WebContent/WEB-INF/snippet/eventList.jsp index f90ee46f16..c0525036b8 100644 --- a/WebContent/WEB-INF/snippet/eventList.jsp +++ b/WebContent/WEB-INF/snippet/eventList.jsp @@ -114,73 +114,6 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (unknown event source id ${event.eventType.eventSourceId}) -
diff --git a/WebContent/WEB-INF/tags/alarmAck.tag b/WebContent/WEB-INF/tags/alarmAck.tag index c036ee8e80..988b4b9769 100644 --- a/WebContent/WEB-INF/tags/alarmAck.tag +++ b/WebContent/WEB-INF/tags/alarmAck.tag @@ -43,6 +43,10 @@ + + + + From 8d0b2619914d4d89b0c633c5223e7b92589669ea Mon Sep 17 00:00:00 2001 From: Kamil Jarmusik Date: Wed, 4 Sep 2024 19:05:50 +0200 Subject: [PATCH 26/63] #2755 Signaling the Data Source that has a problem: - fixed url: scripting.jsp, dataPointEdit.jsp, systemSettings.jsp; - corrected MetaPointLocatorRT - reduce generate events, DataSourceEditDwr, PointValueService, ContextualizedScriptRT - catch Exception; - fixed ScriptExecutor, event per point; - set IGNORE_SAME_MESSAGE for DataSourcePointEventType.duplicateHandling; --- WebContent/WEB-INF/jsp/dataPointEdit.jsp | 4 +- WebContent/WEB-INF/jsp/scripting.jsp | 2 +- WebContent/WEB-INF/jsp/systemSettings.jsp | 2 +- .../rt/scripting/ContextualizedScriptRT.java | 4 +- .../mango/rt/dataSource/DataSourceRT.java | 7 +++- .../dataSource/meta/MetaPointLocatorRT.java | 7 +--- .../rt/dataSource/meta/ScriptExecutor.java | 41 ++++++++++++++----- .../rt/event/type/DataSourceEventType.java | 27 ++++-------- .../event/type/DataSourcePointEventType.java | 5 ++- .../mango/web/dwr/DataSourceEditDwr.java | 3 +- .../mango/service/PointValueService.java | 2 +- 11 files changed, 57 insertions(+), 47 deletions(-) diff --git a/WebContent/WEB-INF/jsp/dataPointEdit.jsp b/WebContent/WEB-INF/jsp/dataPointEdit.jsp index 1ffb2da1b7..2ccf63df20 100644 --- a/WebContent/WEB-INF/jsp/dataPointEdit.jsp +++ b/WebContent/WEB-INF/jsp/dataPointEdit.jsp @@ -813,7 +813,7 @@ jQuery.ajax({ type: "GET", dataType: "json", - url:myLocation+"/api/point_properties/getPropertiesBaseOnId/"+idPointConfigurationToBaseOnExistingPoint, + url:myLocation+"api/point_properties/getPropertiesBaseOnId/"+idPointConfigurationToBaseOnExistingPoint, success: function(properties){ setConfig(properties); }, @@ -836,7 +836,7 @@ jQuery.ajax({ type: "GET", dataType: "json", - url:myLocation+"/api/point_properties/getPropertiesBaseOnId/"+idPointConfigurationToBaseOnExistingPoint, + url:myLocation+"api/point_properties/getPropertiesBaseOnId/"+idPointConfigurationToBaseOnExistingPoint, success: function(properties){ let bCheckedType = checkType(properties.dataTypeId); diff --git a/WebContent/WEB-INF/jsp/scripting.jsp b/WebContent/WEB-INF/jsp/scripting.jsp index 77d8871672..a705d0b820 100644 --- a/WebContent/WEB-INF/jsp/scripting.jsp +++ b/WebContent/WEB-INF/jsp/scripting.jsp @@ -43,7 +43,7 @@ var xid = jQuery("#xid"); // saveScript() nie zdarzy zapisac !!! jQuery.ajax({ - url: myLocation+"/script/execute/"+xid[0].value, + url: myLocation+"script/execute/"+xid[0].value, type:"POST", success: function(){ setUserMessage(" ") diff --git a/WebContent/WEB-INF/jsp/systemSettings.jsp b/WebContent/WEB-INF/jsp/systemSettings.jsp index 519bdb7606..05cd6d5661 100644 --- a/WebContent/WEB-INF/jsp/systemSettings.jsp +++ b/WebContent/WEB-INF/jsp/systemSettings.jsp @@ -482,7 +482,7 @@ jQuery.ajax({ type: 'GET', dataType: 'text', - url:myLocation+"/api/resources/imagesRefresh", + url:myLocation+"api/resources/imagesRefresh", success: function(msg){ alert("Success: the resource images has been refreshed"); }, diff --git a/src/br/org/scadabr/rt/scripting/ContextualizedScriptRT.java b/src/br/org/scadabr/rt/scripting/ContextualizedScriptRT.java index 73209e9e01..267628976a 100644 --- a/src/br/org/scadabr/rt/scripting/ContextualizedScriptRT.java +++ b/src/br/org/scadabr/rt/scripting/ContextualizedScriptRT.java @@ -81,8 +81,8 @@ public void execute() throws ScriptException { try { context = new ScriptExecutor().convertContext(((ContextualizedScriptVO) vo).getPointsOnContext()); - } catch (DataPointStateException e1) { - LOG.error("Data Point State Exception" + e1.getMessage()); + } catch (Exception e1) { + LOG.error("Data Point State Exception " + e1.getMessage()); if (vo != null) { throw new ScriptException("xid:"+vo.getXid() +" script:"+vo.getScript()+" error:" + e1.getMessage()); } else { diff --git a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java index 7f3e078caa..7818958f95 100644 --- a/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/DataSourceRT.java @@ -185,9 +185,12 @@ private void _returnToNormal(int eventId, long time, int dataPointId) { } private DataSourceEventType getDataSourceEventType(int eventId, int dataPointId) { + DataSourceEventType eventType = getEventType(eventId); + if(eventType == null) + return null; if(dataPointId == Common.NEW_ID) - return getEventType(eventId); - return new DataSourcePointEventType(getEventType(eventId), dataPointId); + return eventType; + return new DataSourcePointEventType(eventType, dataPointId); } protected void raiseEvent(int eventId, long time, boolean rtn, LocalizableMessage message) { diff --git a/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java b/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java index 6fb6476712..848f19f00b 100644 --- a/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java +++ b/src/com/serotonin/mango/rt/dataSource/meta/MetaPointLocatorRT.java @@ -330,15 +330,10 @@ protected Map createContext(DataPointRT dataPoint) { Map context; try { ScriptExecutor scriptExecutor = new ScriptExecutor(); - context = scriptExecutor.convertContext(vo.getContext(), dataPoint.getId()); + context = scriptExecutor.convertContext(vo.getContext(), dataPoint, this.dataSource); returnToNormalContext(System.currentTimeMillis(), dataPoint); return context; - } catch (DataPointStateException e) { - handleContextError(System.currentTimeMillis(), dataPoint, e.getLocalizableMessage()); - LOG.warn(infoErrorInitializationScript(e, dataPoint, dataSource)); - return null; } catch (Exception e) { - handleContextError(System.currentTimeMillis(), dataPoint, new LocalizableMessage("event.meta.pointUnavailable", dataPoint.getVO().getName())); LOG.warn(infoErrorInitializationScript(e, dataPoint, dataSource)); return null; } diff --git a/src/com/serotonin/mango/rt/dataSource/meta/ScriptExecutor.java b/src/com/serotonin/mango/rt/dataSource/meta/ScriptExecutor.java index bd0308654c..7531af6b22 100644 --- a/src/com/serotonin/mango/rt/dataSource/meta/ScriptExecutor.java +++ b/src/com/serotonin/mango/rt/dataSource/meta/ScriptExecutor.java @@ -65,33 +65,52 @@ public static void setScriptFunctionPath(String path) { SCRIPT_FUNCTION_PATH = path; } - public Map convertContext(List context) throws DataPointStateException { - return convertContext(context, Common.NEW_ID); + public Map convertContext(List context) throws Exception { + return convertContext(context, null, null); } - public Map convertContext(List context, int dataPointId) - throws DataPointStateException { + public Map convertContext(List context, DataPointRT dataPoint, MetaDataSourceRT metaDataSource) throws Exception { RuntimeManager rtm = Common.ctx.getRuntimeManager(); - Map converted = new HashMap(); + Map converted = new HashMap<>(); + List exceptions = new ArrayList<>(); for (IntValuePair contextEntry : context) { - if(dataPointId == Common.NEW_ID || dataPointId != contextEntry.getKey()) { + if(dataPoint == null || dataPoint.getId() == Common.NEW_ID || dataPoint.getId() != contextEntry.getKey()) { DataPointRT point = rtm.getDataPoint(contextEntry.getKey()); if (point == null) { LOG.error("Error DataPointRT null " + new Exception("key:" + contextEntry.getKey() + " value:" + contextEntry.getValue())); - throw createPointUnavailableException(contextEntry); - } - if (point.isUnreliable()) { + DataPointStateException dataPointStateException = createPointUnavailableException(contextEntry); + if(dataPoint != null && metaDataSource != null) { + metaDataSource.raiseContextError(System.currentTimeMillis(), dataPoint, dataPointStateException.getLocalizableMessage()); + } + exceptions.add(dataPointStateException); + } else if (point.isUnreliable()) { LOG.warn("Error DataPointRT is unavailable " + new Exception("key:" + contextEntry.getKey() + " value:" + contextEntry.getValue()) + " - " + LoggingUtils.dataPointInfo(point)); - throw createPointUnavailableException(contextEntry, point); + DataPointStateException dataPointStateException = createPointUnavailableException(contextEntry, point); + if(dataPoint != null && metaDataSource != null) { + metaDataSource.raiseContextError(System.currentTimeMillis(), dataPoint, dataPointStateException.getLocalizableMessage()); + } + exceptions.add(dataPointStateException); + } else { + converted.put(contextEntry.getValue(), point); } - converted.put(contextEntry.getValue(), point); } } + if(!exceptions.isEmpty()) { + StringBuilder messages = new StringBuilder(); + for(DataPointStateException exception: exceptions) { + LocalizableMessage localizableMessage = exception.getLocalizableMessage(); + String message = localizableMessage.getLocalizedMessage(Common.getBundle()); + messages.append(message).append(";"); + } + throw new Exception(messages.toString()); + } + if(dataPoint != null && metaDataSource != null) + metaDataSource.returnToNormalContext(System.currentTimeMillis(), dataPoint); return converted; } diff --git a/src/com/serotonin/mango/rt/event/type/DataSourceEventType.java b/src/com/serotonin/mango/rt/event/type/DataSourceEventType.java index 8bab31d912..ba912b8a2a 100644 --- a/src/com/serotonin/mango/rt/event/type/DataSourceEventType.java +++ b/src/com/serotonin/mango/rt/event/type/DataSourceEventType.java @@ -19,6 +19,7 @@ package com.serotonin.mango.rt.event.type; import java.util.Map; +import java.util.Objects; import com.serotonin.json.JsonException; import com.serotonin.json.JsonObject; @@ -93,28 +94,16 @@ public int getReferenceId2() { } @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + dataSourceEventTypeId; - result = prime * result + dataSourceId; - return result; + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DataSourceEventType)) return false; + DataSourceEventType that = (DataSourceEventType) o; + return getDataSourceId() == that.getDataSourceId() && getDataSourceEventTypeId() == that.getDataSourceEventTypeId() && getAlarmLevel() == that.getAlarmLevel() && getDuplicateHandling() == that.getDuplicateHandling(); } @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - DataSourceEventType other = (DataSourceEventType) obj; - if (dataSourceEventTypeId != other.dataSourceEventTypeId) - return false; - if (dataSourceId != other.dataSourceId) - return false; - return true; + public int hashCode() { + return Objects.hash(getDataSourceId(), getDataSourceEventTypeId(), getAlarmLevel(), getDuplicateHandling()); } // diff --git a/src/com/serotonin/mango/rt/event/type/DataSourcePointEventType.java b/src/com/serotonin/mango/rt/event/type/DataSourcePointEventType.java index 77cc411561..f0a04b54b9 100644 --- a/src/com/serotonin/mango/rt/event/type/DataSourcePointEventType.java +++ b/src/com/serotonin/mango/rt/event/type/DataSourcePointEventType.java @@ -35,6 +35,7 @@ public class DataSourcePointEventType extends DataSourceEventType { private DataSourceEventType dataSourceEventType; private int dataPointId; + private final int duplicateHandling = DuplicateHandling.IGNORE_SAME_MESSAGE; private final Log LOG = LogFactory.getLog(DataSourcePointEventType.class); @@ -52,10 +53,12 @@ public int getEventSourceId() { return EventSources.DATA_SOURCE_POINT; } + @Override public int getDataSourceEventTypeId() { return dataSourceEventType.getDataSourceEventTypeId(); } + @Override public int getAlarmLevel() { return dataSourceEventType.getAlarmLevel(); } @@ -77,7 +80,7 @@ public String toString() { @Override public int getDuplicateHandling() { - return dataSourceEventType.getDuplicateHandling(); + return duplicateHandling; } @Override diff --git a/src/com/serotonin/mango/web/dwr/DataSourceEditDwr.java b/src/com/serotonin/mango/web/dwr/DataSourceEditDwr.java index e6c084f91a..a15f525fe8 100644 --- a/src/com/serotonin/mango/web/dwr/DataSourceEditDwr.java +++ b/src/com/serotonin/mango/web/dwr/DataSourceEditDwr.java @@ -44,6 +44,7 @@ import javax.script.ScriptException; import com.serotonin.db.KeyValuePair; +import com.serotonin.mango.util.LoggingUtils; import com.serotonin.mango.web.dwr.beans.*; import com.serotonin.modbus4j.SlaveIdLimit255ModbusMaster; import net.sf.mbus4j.Connection; @@ -1187,8 +1188,8 @@ public DwrResponseI18n validateScript(String script, response.addMessage("script", e.getLocalizableMessage()); LOG.warn(infoErrorExecutionScript(e, "validateScript: " + script)); } catch (Exception e) { + response.addMessage("script", new LocalizableMessage("common.default", e.getMessage())); LOG.warn(infoErrorExecutionScript(e, "validateScript: " + script)); - throw e; } return response; diff --git a/src/org/scada_lts/mango/service/PointValueService.java b/src/org/scada_lts/mango/service/PointValueService.java index 747b5a63d6..ea9811c293 100644 --- a/src/org/scada_lts/mango/service/PointValueService.java +++ b/src/org/scada_lts/mango/service/PointValueService.java @@ -681,7 +681,7 @@ public void updateMetaDataPointByScript(User user, String xid) { ScriptExecutor scriptExecutor = new ScriptExecutor(); - Map context = scriptExecutor.convertContext(metaPointLocatorVO.getContext(), dataPoint.getId()); + Map context = scriptExecutor.convertContext(metaPointLocatorVO.getContext(), dataPointRT, metaDataSourceRT); PointValueTime pointValueTime = scriptExecutor.execute(metaPointLocatorVO.getScript(), context, System.currentTimeMillis(), metaPointLocatorVO.getDataTypeId(), System.currentTimeMillis()); Common.ctx.getRuntimeManager().setDataPointValue(dataPoint.getId(), pointValueTime, user); From 1729a25a05c8a1673af51f5c534cff4db8bc4eb8 Mon Sep 17 00:00:00 2001 From: Kamil Date: Fri, 6 Sep 2024 11:42:41 +0200 Subject: [PATCH 27/63] #2755 Signaling the Data Source that has a problem: - fixed ASCIIFileDataSource, BACnetIPDataSourceRT; --- .../scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java | 2 ++ .../mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java b/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java index 10234745fa..0255a7ed9c 100644 --- a/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java +++ b/src/br/org/scadabr/rt/dataSource/asciiFile/ASCIIFileDataSource.java @@ -44,6 +44,7 @@ protected void doPoll(long time) { new LocalizableMessage("event.exception2", vo.getName(), "Arquivo não encontrado!")); } else { + returnToNormal(DATA_SOURCE_EXCEPTION_EVENT, time); String arquivo = readFile(file); for (DataPointRT dataPoint : dataPoints) { @@ -61,6 +62,7 @@ protected void doPoll(long time) { new LocalizableMessage("event.exception2", vo.getName(), e.getMessage()), dataPoint); timestamp = time; + return; } } diff --git a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java index 169df04f25..d2824e4e85 100644 --- a/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java +++ b/src/com/serotonin/mango/rt/dataSource/bacnet/BACnetIPDataSourceRT.java @@ -407,7 +407,6 @@ void pollDevice(RemoteDevice d, List points, long time) { BACnetIPPointLocatorRT locator = dp.getPointLocator(); Encodable encodable = values.getNoErrorCheck(locator.getOid(), locator.getPid()); dereferencePoint(dp, encodable, time); - returnToNormal(dp); } } catch (BACnetException e) { @@ -425,7 +424,6 @@ public void forcePointRead(DataPointRT dataPoint) { ReadPropertyRequest req = new ReadPropertyRequest(locator.getOid(), locator.getPid()); ReadPropertyAck ack = (ReadPropertyAck) localDevice.send(d, req); dereferencePoint(dataPoint, ack.getValue(), System.currentTimeMillis()); - returnToNormal(dataPoint); } catch (BACnetException e) { fireMessageExceptionEvent(dataPoint, "event.bacnet.readDevice", d.getAddress().toIpString(), e.getMessage()); From a38938ca2be2c6b65c344cee5475b8a884a2877e Mon Sep 17 00:00:00 2001 From: Kamil Date: Fri, 6 Sep 2024 14:03:02 +0200 Subject: [PATCH 28/63] #2755 Signaling the Data Source that has a problem: - set ERROR logging level for dataSourceRtLoggingLevel --- webapp-resources/log4j2.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp-resources/log4j2.xml b/webapp-resources/log4j2.xml index 710bb4aca8..8f07ef9f6d 100644 --- a/webapp-resources/log4j2.xml +++ b/webapp-resources/log4j2.xml @@ -36,7 +36,7 @@ ERROR ERROR INFO - INFO + ERROR INFO From 5beb0c5c77c5964b594b4a227919bfbff55af121 Mon Sep 17 00:00:00 2001 From: Kamil Date: Tue, 10 Sep 2024 22:32:51 +0200 Subject: [PATCH 29/63] #2991 Upgrade Gradle to version 7.6.3: - corrected build.gradle; --- build.gradle | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 4a7f3cd209..eb9a134bfb 100644 --- a/build.gradle +++ b/build.gradle @@ -105,7 +105,13 @@ task existsScadaLTSWarFile { } } -task deployTomcat(type: Copy, dependsOn: existsScadaLTSWarFile) { +task deployTomcat(type: Copy, dependsOn: [war, existsScadaLTSWarFile]) { + from "build/libs/" + into System.getenv("CATALINA_HOME")+ "/webapps" + include('Scada-LTS.war') +} + +task deployTomcatDev(type: Copy, dependsOn: [warDev, existsScadaLTSWarFile]) { from "build/libs/" into System.getenv("CATALINA_HOME")+ "/webapps" include('Scada-LTS.war') @@ -154,7 +160,7 @@ task buildRunDebug(type: GradleBuild) { } task buildRunDebugDev(type: GradleBuild) { - tasks = ['clearTomcat', 'clearProject', 'installWebDependency', 'test', 'warDev', 'deployTomcat', 'runDebug'] + tasks = ['clearTomcat', 'clearProject', 'installWebDependency', 'test', 'warDev', 'deployTomcatDev', 'runDebug'] } task buildRunDebugProd(type: GradleBuild) { @@ -162,7 +168,7 @@ task buildRunDebugProd(type: GradleBuild) { } task buildRunDebugDevTestUi(type: GradleBuild) { - tasks = ['clearTomcat', 'clearProject', 'installWebDependency', 'test', 'testUi', 'warDev', 'deployTomcat', 'runDebug'] + tasks = ['clearTomcat', 'clearProject', 'installWebDependency', 'test', 'testUi', 'warDev', 'deployTomcatDev', 'runDebug'] } task buildRunDebugProdTestUi(type: GradleBuild) { From aa0010aafdcfbb2f803074f10dfd494ec6054fc3 Mon Sep 17 00:00:00 2001 From: Kamil Date: Thu, 12 Sep 2024 00:45:28 +0200 Subject: [PATCH 30/63] #3008 Fixed actions/upload-artifact: - update version for actions/upload-artifact to v3; --- .github/workflows/build.yml | 6 +++--- .github/workflows/master.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aa5c086b8a..065127f79f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -38,7 +38,7 @@ jobs: check_name: Java JUnit Test Results files: ./build/test-results/**/*.xml - name: Publish JUnit Test Results - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: junit-java-test-results path: ./build/test-reports/ @@ -81,7 +81,7 @@ jobs: check_name: Java Script Mocha Unit Test Results files: ./scadalts-ui/test-results.xml - name: Publish Mocha Test Results - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: mocha-js-test-results path: ./scadalts-ui/test-results.xml @@ -166,7 +166,7 @@ jobs: key: ${{ runner.os }}-war-${{ github.run_id }} path: ./build/libs/Scada-LTS.war - name: Deploy WAR artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: Scada-LTS path: ./build/libs/Scada-LTS.war diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 5f5a2911ff..35d6e89d01 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -151,7 +151,7 @@ jobs: key: ${{ runner.os }}-war-${{ github.run_id }} path: ./build/libs/Scada-LTS.war - name: Deploy WAR artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: Scada-LTS path: ./build/libs/Scada-LTS.war From 22b13061e8d2cd6520b84857fe26a4194d33734b Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Fri, 13 Sep 2024 15:23:27 +0200 Subject: [PATCH 31/63] #2995 Added saving custom stylesheet to the database - Added Css validation for saving custom stylesheet in systemSettings.jsp - Added V2_8_0_3_AddCustomCssColumnToSystemSettings migration class for new field called customCss - Added initialization for user_styles inside MangoScadaConfig.java --- WebContent/WEB-INF/jsp/systemSettings.jsp | 24 +++++- WebContent/WEB-INF/lib/classmate-1.3.4.jar | Bin 0 -> 65100 bytes .../lib/hibernate-validator-6.0.23.Final.jar | Bin 0 -> 1158122 bytes .../WEB-INF/lib/jboss-logging-3.3.2.Final.jar | Bin 0 -> 66469 bytes .../lib/validation-api-2.0.1.Final.jar | Bin 0 -> 93107 bytes src/org/scada_lts/config/ScadaConfig.java | 30 +++++++ src/org/scada_lts/dao/SystemSettingsDAO.java | 2 + ..._3_AddCustomCssColumnToSystemSettings.java | 36 +++++++++ .../mango/adapter/MangoScadaConfig.java | 5 ++ .../mango/service/SystemSettingsService.java | 9 +++ .../scada_lts/web/mvc/api/CustomCssAPI.java | 73 +++++++----------- .../scada_lts/web/mvc/api/css/CssStyle.java | 6 +- .../scada_lts/web/mvc/api/css/CssUtils.java | 49 ++++++++++++ .../scada_lts/web/mvc/api/css/CssValid.java | 16 ++++ .../web/mvc/api/css/CssValidator.java | 53 +++++++++++++ ...ava => CssProtectHtmlEscapeUtilsTest.java} | 4 +- 16 files changed, 258 insertions(+), 49 deletions(-) create mode 100644 WebContent/WEB-INF/lib/classmate-1.3.4.jar create mode 100644 WebContent/WEB-INF/lib/hibernate-validator-6.0.23.Final.jar create mode 100644 WebContent/WEB-INF/lib/jboss-logging-3.3.2.Final.jar create mode 100644 WebContent/WEB-INF/lib/validation-api-2.0.1.Final.jar create mode 100644 src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java create mode 100644 src/org/scada_lts/web/mvc/api/css/CssUtils.java create mode 100644 src/org/scada_lts/web/mvc/api/css/CssValid.java create mode 100644 src/org/scada_lts/web/mvc/api/css/CssValidator.java rename test/org/scada_lts/web/security/{XssProtectHtmlEscapeUtilsTest.java => CssProtectHtmlEscapeUtilsTest.java} (95%) diff --git a/WebContent/WEB-INF/jsp/systemSettings.jsp b/WebContent/WEB-INF/jsp/systemSettings.jsp index 27f89f13aa..9ee7502b40 100644 --- a/WebContent/WEB-INF/jsp/systemSettings.jsp +++ b/WebContent/WEB-INF/jsp/systemSettings.jsp @@ -33,7 +33,7 @@
diff --git a/WebContent/WEB-INF/lib/classmate-1.3.4.jar b/WebContent/WEB-INF/lib/classmate-1.3.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..5be6d9961f53680ce6753a22b061cc373320d020 GIT binary patch literal 65100 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%0DB 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
  • XTblrb>Yd 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%0D3jt1 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

    a@q8;Jsmt9t$nD-Eu_cfJhB_mbo05iw$ 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 (9A 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%0DcN3mk&PQ$=IQ>0$ZGz}81xA1jdG^=y}`p` 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 z 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
    TW% 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%0D#P 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

    O-wQy}5=(%&E}>)BfsLY7 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 Au>b%7 literal 0 HcmV?d00001 diff --git a/WebContent/WEB-INF/lib/validation-api-2.0.1.Final.jar b/WebContent/WEB-INF/lib/validation-api-2.0.1.Final.jar new file mode 100644 index 0000000000000000000000000000000000000000..2368e10a5323ad6bae79f6cfac89d61e66b15f37 GIT binary patch literal 93107 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

    pY$L{s_ZSzlwTZidEm3>v{$mF$KL1%b)ndT# zBR`_(wqJZ&3o2?zZPV3qM%*kT)e`)+NU)B?jQjv$9hQ`xl;0t9Mwv}iPTS{Sw`ViL zK6K~FQ`LC=R>}pmsc_9%SdtZmL`f5+BBGTXJ)~m>O}AVXhn@3IN%hG{ibLr%rLMyh zpX0Z`)*h)9E$DC|7d0;%c%|m*Prw%D9O_0`Xe7O@J5)sRiFNsDLivz9fsMr+rWR60 z%gW6$&>D{I&xdM~gL>c$Y|%kTOCe}Oj7gzfG*7;)8FpM)&DZ6vQ}c=GC@nEKk(1jUis5ssktrS&#ImYFhD>ue@jdMPj5BZWij!dDGW-d=+iGi_ z%yz#My#49}SruM{0fR9MEnU!Ik5#U-*5(2#kIiw`m|n44MLu$J$A1`KgadD(kKncfL+Z|f7@u0?l zg5jyS6qIDBf(ZQqROT(Q$&Dud59VJQ#11taVVlr~T!n6FAqG_a(2daL4^MGcR7=Xf zGxWH}KWEB?NVyxdhnzAgsa(}_7rO-9B6oi7GS1Bf(g~S`9;VR@RSBn{`sp2h8e87H}`4nj!Ay0l;GA zyN}Kb)n4{Gqm|NJU#qs>G0M_lPbl*ojs;?@Ua{M)po%jXbiAYWBxBEAR;A?~=Egl(?1&(T8l-?(=b9L4kh&hNk zsGYT~gLiUudUSqx5BvTj7z3;x@<`$2*Oz&L*CF|5u-1yaC4Ek$f`B&LUjcvr4%XMB zxlzwh6@dN+CWh;RopkFYb-mV-5o{gCH+Fu3G?e$y(2r0GD4T)J6X=ba$tIdOe#r&l zY&f#dtKH4&xzqBl38|Sp=3^PnJo;aJZ{Z9ed5|gRC*nk;L}f&^`r+7v7bcNrsG7-; zVpvC@zm|8R@#k$a1*-9LRwRDd;qKPjiOjy_0Kj(Ui;t03yL!z3l31p4ZH#z2s|R;us&M7~YsL#8Jqf>C(YalleWp`4&f*}GcYi&Q>e z;ljDsKwCMcjga{{{$LNiyEflsh;#Ya#OjNAYo?AB@w?hdYp0@4K5d8SF!YaZbaD4l ziC4R}b3bmdFrFrAGprQqe=Qc?5wo>!z4Kc~R%WC^(fV>68R6D%C4KTKJzL=Djmw;M zd%#>n){@Zohss!6L8J9#jqsEJ+APMhhmZ3Dc=GVe{WSrUX7D4>#zx78-wUNe6qfdz zr@515qGTPWxoa0U+1>h2^Y_kt-`+G5TqdwJW*4kvM1j~T-c<`vq(_THY#s7aWe)=9CeznZh_l#o!~MOpHz_#RF~2c+HlX*}DP zys98CW_fjCHAWNUd`yL@bZK=c{f9iAUQi-@8kAZXcx$DqPt_Jk=V<&wmT6XJFpFfw z%oFI?GJ_pZg9h9W;koOvt|i5AOsdu)At@EQ?{yzi<`NT!Q^ekXmo*IR0TUZVb*Fs% z`SRNOI_mz6$M+-61mS>W*9nM6!oMA!fEvNle9dxS$%g zs<1=pK*BN59|EYw*5{k-CNS8*T@Jp>mUr4DeI=kw0=sVWuFyV5$1Lns$r6~{bP1)_ zCl*Gdrr<8HP@(27sZz%)L?<(jjde(UR#&X-M4ER^iT7J)(e*ZZ+`dduwMegrE z^~QexH(?hiXM0;q&*zn{-~XrIDO6?fc_-NiUAC{sXKl;V0eE*)_S`@LDhvkrw0tTg zSu*D8Dr{IB`VHSLuy3LU3p5TXIgDd!ciYLP>P%^{udjzUNL4r)+0{-XxE7CU#KlPbI6aSwQ62gptY2^1@L$g_Il8a+8)^) zI+wl6P-VvfHq47_PQAK^IIgHAl~%K-tkF;Hzt1b3uDi97OscPn+jvLt<&&?M?XDj> zqgv)_zdP8Cmvv9hy8=RH^LP4p%aP6F#kh_dLRS=Is1U15e$Jjm<7I)OUA|t^NYj<= zR$zBD42t(wKZh>spQ3cIL5PBHrQJ}tW5KbU_GGIN1ECQNgFNy^qzofZw^Ag=5(fQX zu>08ZzlCe&vuJX99~d2(9T^^(;~9|lZOHsUf3AsNN6nw{#L>Ab@GMXG22d0Kb+PZ? zLGxcWx?ZUhYAN!AfuZO1fno^DUWIJDPfI~!Kstd{(*P~EguQ5dzU2c%@gsQvw|oL} z*94B*gjDlY%lqrcbLe#(QGBMOxNS)o(t8{PRy^h&yCAv;9N~s(_YGq^gr*gi^e;3= zde?2ENX0zz7{a+kHiwR^M;dk?+#r|}>^OD#Eu7RR_$0(0zMNsvqgxwA-wE(K>T@<| zy4j4oHCH`qAEufOZLj28w<{@_PJ|@yo@aqDU>ibx9Ehy$+OCu-J>|AH5#fq)y&Fhq zI~sxs@wT)rU3C_-n`^bYO^oj#b{sy{d3W)o4(dflD}_HDBs0z5*Hjtj{A{?T zo7c(rnV!D2c()RD4xRKp&wNYIqUnMC^S1?i-bOjcZ|9HxJj<{T^k3~;;LJ(`);0}W zhXP{-tM`Kt!gYqs;c}MjkoOI0G{e%`C`n3(2olXuhAl)yXl(A6trh0F2jjI+;79P! zHWuIGr`>!t^U?X3Y8Lwo!6{2AMa?+QRH9o42N%3uJTk2M?KiInFgUrV9c{x7g9x=~ zU##RJ)DBitE=nZ10B{zx%Dq;J3~xvnD6$kbMstJJj`sngpwd+~7Em-*FxL6YxvC&r z)d=ZHn=dLGuRZstPrbQ0W}h{L832j>e`NRxzTncHrJ;XcWdFr5e_`WT=AcowD@?); zV4&CwN)SnkDp>tD40CQM^^WdnbGNY!Ctf|j`==cmptc}k&@3DU7K1f^P>^8yj}aY4 z0N??KFf~~MSR_+IJVa#2VyEFvhModVK5^Ag>hHv#Q8g@~Uf4KVMvFM+pgZW%@)`TnT&{2DucE-ltRns<1p0V&%+@NQDD1mm!}wP$ltL49did>P ziA*_DjJYINv7sKxSvp#&Or!JjV_+B}_$T!PymW9Uc>7@um2!MgpKu8jrl^9@^UZPCWr zo&=t@ATx!=H+*grS9qAAQ`SxJHde-8J^>d6^1pAme36o8Ni2B;pZp+nB7beN5^(Gy z7wfWHm<*j4v1x#0`^2@Eifdq+w=&gO;Y(sk17M|L0a$5i=l1!d)=FjSl`zk&G=pCR z_(&RK`I)s&-?!jbhg=eT96`o^?Sfl_L5*yr^}n_M;y)DxzMOO|Cj^dIQWfTZWe~Q3 zQNh&|6sB($U%rPQ0~U!4WXN#Ek@+2 z`hX_yP+Np9)kNJywN5=d^!DX`^E$Zx3_CQ4fK&`X*gcOC{PlkG$58@6Z2c2(QGek1 zUU0%#1;$Dwq+ig9k{VD&b(ISCNv9DLKBf&M9I8~alnXsD@dG-+ieXMz*2t-Sp{*G{ z<9y?HM-R7m$2>r70idvY8Vc3x1>mY6&GhPN0K$e827o6LK?O3KLM19JX3*|A!B>Pi zjiD0as^6~@;sRm~Pemfj7Gv_kr!ZU~x|;#QU9x~6tn~Q-|2Cg%1jX4PIZ+XDFgAm1914L~j zKfjS{Vi@C2143OPm>4nH|96eRYZ~Yvo9i!J0vX4BR{TN|M#;vIOU{ z)>i#9${C=6J|Z#y`N_P+?;Bg?KBN8@sj6@HRLrX-vH&{dK~`ohkp6+I89}XfpW)+L z4)s4=zOVHu-3y%nE}vP!r+;(#AZ>w9{>|k>JlVP-**3(7CVe&f-q$9P>GAy$+~9LoN0=?@0;}YR!O9 z`)i->b*KT>V*omGcK?nx6hWk{f{uD{+tQf`t$SkPI!{d0uZEEW(me{%9p8G+au(h! z4YT#XX%=n7JASl$GOoYo2h^d>$jUjnt`Vq?(?%X^ z(=3ECz|LhZIFl#Dm=h2k9wLqpvhUAz5 zwahRnriz_uG*ra>RDs8S0`S)TA6!yJo;g8h1QPu>I$pVbi^q-S-=S;XEUN){rAl~k zxyFTfZZXrnbZbKzm&XdS!SKViz`uGm+6{ZW%>ZQU7*vou(`{&*F_+OxX|t`zl@GS2 zPnFP#$^45o8rK;xU{ItEOWarsk+(0MT14dT}V(Jiz>-6M>z`(dz^FefF8AR)E zD!`Wedt7xkfvI^T+wk3k?#(3x5ugbW2}jqVc~#BSQ_Y8tsA?-mfbpoY0(WCWF^B4N zfEeO(!wARA8tI=+XzJk;oc*@m(P){R(NJKoD0r6Q_?t+3>MDoUv>f{F?uw? z!KuO!z07KyzGti~w6%Y21L?rF(X2A+YyroGgCRjS9az6Q+iSQa6x&=V#OFfN>Kj5Z zPC5{gC{S)q+NTwKyHB2yJBbN5)Xpg_WHT5BX7%-eLM*b=GnR^u;9RTlf?r6ySi{e% z2(IBR{ISI69J(*C?3jZ{QBP0XEw~#b*k|XcD8=qO7t&uPIV|f}5PG=)1j3WEhSQbv z^orq6lV|O35P!m-K*CAsQaF4bEbv}LI{C>*d@RQftB`nwS-65tuHQt zVlMqrUodnjgtX0jI;ubbQZj^@$arYFPMP@YKUyblj0Yhi&*1A-0QkB&GiJQe?H~9C z+&r5>Ovh$QFcpP^i{pYVe=U<2+xZ79Mlxbch&UOQksy`ug$NYDZ0j5p+L9s;WE+u? zO0pl!oR*xyoO}Ta$rB~YH^gQ#)BM5}6p&D5SQZli%6#p;q$ck+3~u&V#S#&LWAWa$ zXzT798_&~~jRoB3l^%_1ow+;=7v4tkY%TTxr4^^8>C@@rT~x|C+O=mys2-|kCVPCe zdHS7B4yKuf>SHKi`5sv&*5VfbBRAswwMoM^J&ckMBtHNh5_6elJ!>u-M+vfUTD2`P zxaBzzAGF1&{uJ5v#DW;>$U1d@iiyOTJ=`ee-vLqq$Bz}?i`qeKhCM(8fNyw2Ha0O3 zQY;1Ig%T&S(ppklYs@Nqs{$!a>obI(H3UuKX^Qy7$8OlFb^D@O^xAcQI<)~u&72VM z!QueY3iQt;C> z8nJ@Pxj@~5InLdH;(cy_`nB}IrDR4)Yd|b@z7D14+nror+504cS=c}ea^ryWc%fww znC;MIR25O8A62P99@<`^l*VGaz5*0rdK89wy>T>7-{QD#btfifup`9>vP)Ftq0mAE z(OQmD?y-jU?Od1w=y*^fRKvaJI&t;9)wTX{pFHK6Iu|cMUxBgv$#`GIZlVqOh(A~>+@9W6= zGv?ZKGAPUetrZ7||6+^qFQp8rn2n+N@9Ub1t`n*$n(wMv!b-k$EBu7gk$G84{(Kk) zvbK~^OYqDn#4>BzMs6*XzJ)_ggKqN4|ro9npKoz6YZSi z{JR-9Tm+}&@=s64@<4|UQwmk7on$t}oO!t!om49GIvWzI-DMHSaP4U$Zmc6LdNWlW z?y}v)c?E{y=f?2Ek=YglOpDZ3AgQ|jKfT8r@TSleTwC!%^b$XM&*2 zsIIsOlViQ5L-uyxjzvdcvMU7d=tuF4?+b8Ugo`LC9-_9x)U5mN&ODz2rtBu5+b!nJ zd)p!{@ZVbTYg-ZPf2y}iKej6qM;K~ymY9YMg-jPuG5fGM+|+LP_4pKwH}p;DoQ80} z_5*(Qw~bE~n=Jwx^#v|vn<3F|=f%++)k59F^r4Cqbk~p3ey1MnyBSkVAGq)@Z7}9( zYc!2&N616D0>VG;=2w=l90yNdg?n#IAROGgJ-CVlmbb~(g6tx$MLZzeKCDq($UDYo z`_9;6r0qCeY4eHtLG54A%7Y_~^*14H8AVDn(f6kqizIVEU=?}%>Pe8;vfUQEr${E* zreJx03vL_}cN>=?5N9LR=St~^Zoc*45-Dj6SB{ ziRK0l3M(KG)py?zsb>7bJ_y9bK}7>UNtm6(>gQ0hPBSXI&B_Q}bI%1^{a7?xJn7+$ zbfZqZJv6u}ui$s9ZoP(YMTb3X+2oJ7)$JGeG5gdnbaKcFdIy;qk%>OFf|QJhd_hDh z$wrBp#MB~QPBKk3icB&_+Ea*SC_XFEc~L@kLwi4kY5MIz5|-hzEfoo#llCAo`HGrV z5LIJAw8OHkB}s;}Hbk@8awrm_o{oI9C!|$f4TS8w1n>K%Fn^2(GX8G$CRz1!Z%NGa zxE}a6qRQYWWC!e`;ad5Z;osL^>Yv|m@>*}I3!oT?1LTgsu9d(3hW~*}{zobBjF%QQ z*v`3C^X@SZv&)ErMO8<|+9YKZ4ly#)h-GHaH`z-`jsB+Zv;ldm*rzRFB24@t%WEmi zN#1MeG<%!@s437G^atE$9DsV*P2V$z>&ut@#=fJd_VgxVz1JKro3J>ALC^pr4yi4F z4$-idNt-)0X=s(lX9$-(F>-gTwvw2Y78Q{LGo5{iOtj38Mnffxn5M28%nvumvGPqS zS6fLWRBH|Ud2=039Qdul)ke(~;&cb@C;t3yHoS@}POa0YGtZTP^GhXgS3(ZwsY{wk z$9~x?#4s{Z@&mB|HJJETAa~r^J9LmI7l4;1 zWMgP&{ks}Sc%g8;W;7z&tbl$-MmY_MZDD`uXHcOWd>E8&A0TllnNL+C`hvx93*`MT zMk6MFw$InrU%jrrk5A{QK&zcOz+MoE@bet&{sI+)07l~k()-@}*k?v#-gtgKFiDlC z!+cxr+%#M<)JQ`_GgLHmnM!aNnkp}fi>qV;(hH+exw(+&v>+#f0J_)+z-UD0QKHb; zw%%#@;RX^+7#$xVquPSXY)SB0$>vf(A*pA6KnvpHX%AGX&mW;X><3iasF7X~56AZ= zy4q`w4Gr^;i;5`sM~R`7HJnxeMx%xsYL0vMGovxc<^jNH{1JqL4?g0#P2mGzG#Z{q zSspL$Nig#J;Tp6jY~b^$egpK@STn`BJL%nOxM)nY=5Z0Qx`J7T@Asye4(klr9Q8^T z8@5#2LyWV%^tCWb=I~mNn={jP0gT4-67609qmc{1Xk3J{HT}>mlY`+&srrNns4ha9d&h*~lUvQ^oaLI+VSt}yd8w0*xoBf?sgy1|KZzA+J0GCFcx{LYlcLupiXi?) z=K=J&r|~+n{){>F_xcT7fSA+&-*jyOASg>)LmOE`_upl}^N@fbTDvlTgFsU5j8^@R zZmAsG`IOrbCc#h0!kRU-s!Igpfs6Jg0{;J;rWU&|vo_C5s* zECT9KTI0;l425Or0~61eI<%qY3(&>Sb@<#!rp%wf_(q5y7(*SuPiC;0x%%OMKA55! z0o0)zUDqUo6isr8Lq*V6ACLxqyr*%Jtea6s!kb2v)X_ui0}(=2F-3&wryHDk{GGlG;M^e5PYsBZKYS7)N408W#9ynko zwa&%2Q|Dn`8@4sIoi!luSF=GJPyiX;&%lECJ#yMD`oPwpAX@TwRqy>dnK~RG`%#vA zg?tqOoLcaFpp4VbN9z)04dGx&rfnhsGW3no8Psqva6Yz8hcSNE-Wfob6hCXf3VaEt z&j8YOqgk(|3X&lb_tP39uh|9mKCB9B< zfD6&9tQHKo;67)yr2aFdGdliF5~=@ShE@@pT1X5|Fv)}tR5m~FY;4hy*AN*3n4$LL z%|-3|&jW=(yq(R!;(*hSlPor^mhd~+$qB*Fa_ID0L{u81oQDn4|S03`&O^IN^~XC2_P*$8bFT zde^n1NQb(`eOE%N(e~%&?0H{Q;YycA9bSI{hHcB3{}&eRiEm=v8yRVBCHCg3CIp4{f4KMLPi+X1P)=s z$iKz^A;W}V67OB?oWev^xuLkQqA;{8AfvrG>ISBkci0i|!s~J*yMM`Oul@C>C&duY zPu~E%$PYMO{>OK|Kj7xS517|o`u2ai^rpB}L5ggJJB3K>sUn2NNFF*`$92a3$P4MeLzNF%)e> zuz@2<{_`yti~BQZ%*@1rhX!V5*XlD`n;a zt9V~T6Pa?i7;`~E#5Ggq_6O^^_DAdd(5IbU2BYHV%_(?A;${})T!;eTDUc%&7qCA* z5St_%8gHd5zq?{L^khXy5&FSfLN3vk9%UVD6DG9k-h-sWY3p%XPOg?&r;We-@nEH5 zXQsVjhVO=dkq%@hWX6TBXzq*_a@Tk+lN+OcLVv>lGV8;qW1DBbq!3~OwO_!z;=p6| zn~JGJ&tm{zvbofx=Y=mx@W^#o>}D_~<0k+1>tbfx=z#o{&HSeyUL!1RQQCSVAMH_W z&g^6WidN}_RlJIg^z^AQ;@YY3vR`-pl2S^l!2dod$^(z^{=Vmb-}9X7%Q^Qmv$M0iv$L}^ zBtZG$LEZzuZ(P@C>2wr7hI(OMkI==qv?xg2#iwCwMT{k>>TgJ{CSI-N`1A+-yG8;` z{x8Dr^<*l8b4474BfRhDvN?K=PKJDelc85fCqs-(Lm!Y}H7HPQ%D+Ye7CbPEoYXLI z-P2VWU3LRzks?6hG0WPh8QNH$m{35jP~fss!qAAta=zNyRlpaDp+W45 z?y9yF;9a3!mi>}nYz&pcFfQ_wc~R}0C-LN6e=JxLYCkkC*0%T<)|lCq{m(d1GP)l; z43P)uRE(Lpulec|esr}Z%T*WAdXGWm7Fs;*%p zP}O;m4zrHD@C&c?g%-lkK#?MhW@a+e>Anp+cjb!irJO>snB3RxI&4uo>B`@aPX11I zBX|e9K2sxh20HjZ)gu0Dx}50TAbCm9O|-&)}0Y(>1M=KhcjW zKEEzeafPC|tNmfw>)+LgWw5`bzw~uwZF6OvFbMnQ5A`Iw>~JLu&+4|0Qv+xd^tNJ^ zU37qLDU@edV>wl|;|l%~sUw zOu9n~cT|k{5m1bH;|-`7G0U(es2H)ecY4p&)|KZWZx!vf+e0JFhBx1v=^Ua3f4ZYy z_S+*Wn>2dl5#{-~HgMz-rJraZC)}^1+^i%bPhh|W_CcWIkniy6MBb#)B=6TN8SK?m zw#=<1j`l(PdH7a-tcUYejIpHmV2TBdnnS}{x1LiVwpzdHNw2C$20Wt0a&89*Fbs#; z8bEb%#QSgpsBL;^g@IadHhz*ix3918ts=i`+rH77j6iXPmOz<3540Wfy&^qRh^Sr| z6!Qb{h_XBA6#Vvxp6oyHo-KLUVgND#{DGlMcacX_!NmDwXvnbz@R_{|+x1zQ_`D{Ua$kTO4BHa}+T@}XcYL>9{NDeGla zP?rkbsMeW^$6~Tv11tdb!du9)O@22q#A*Eu@{FX!aMU$7x^rQ^etN)<>?rJ&)xOy1 zLQf{QF)#0b^9gPdp3hhmi+rt;9`t-|dj9jaqUHlex^^S|SA`2(-(9F?6&P?dYfR^* zMw4Z=h+H1BCE&J%tyEkuHThr*znMORPW_ShjpV*okTbu-V38Z42M=Mpd><0TTe$b{~#EhrlWz@>ch528Eu;jjgKz(l__= zaEm$TINyD3Zz7a&d>Z(yv?g~$-;9t?8X5+(JZx7`4Cxa|kSZpNA0iV_F&twDs2KkJ z`P6e?51$kt`YWRZ5(MpqsV3JPbkVl&IR(<9jm$s=ca9yMSe)!I@UC3PeZXn?U%L`y z0h}0~Kv$ZAjJXZ=8nuEwxcV&vK`!!xZ-|=c%jsr$fBYvnp?I)kVJwQdG#Kt3N+zs2 zHhRT}$l=9%Udt(O;?`E4_LM8y?RAGnEDmipTj=z3MSW^fDLyjh-gZB)vA2Nsu2|m8 z8Z1y4{P0Qj$d=2aMESu-u4&2f+m@^F?z;lma-k0#-F(ZqRkn;u(lCx}xj_`p)^>Gc z*FoG+(&yiio1-FJwa`?st*;q4Sxg6KjNNVN7oFJJEh^1VRD#%%_@Iu2JMKuLE0sqb znQ3xudkPBmo>Ks*BN1eB-X3|3Pj(l0N8-39iQxd_@jt~`fI9NGW8$O*X8|5(;SKUj zC{P^7Stu+)h_irCa(e`dvxxr_XK`5zPmXmm{gVB!z#f~s2vM&|j{|#r0_&XjU%JRJ zX5rt%h)t9zM~H(Npd--}!3hzGbIUOCy5_6Rwq9&4NXFkTA9Mp(o&wk-61veS%>?Yw zy30p5E#5IgYUJ|IgIA<>;l)-=N8~69z3lX3i6|uyF+r4>2*WYKm#dTX#atdm$zkQo z>|9!{cuFA70wW-z1dctiE+Y=9x%G>e(( z3_{lApNn23<#y&jh~qhwiR`~HtkNnM%^@lA#z^! z04N*SKj&P%esUep@b-{V>8f()=SSj@$MfCi-v2aqK zz%`AMaKs!G92f~`8^jEUCk?mXVHPK54bT}UXx32Dam?PuCEmagKD7lbXR@zirqFNg z#6CXceDlCSIOUIH^Vgd0<%V2Fm!($Naf1iDn~!X@6_=f#W%Df5?5+hpo`Rk~ zE_n*|AYQ|K8!>-n>Txes-+R{*D0ZiNqROQL)YY6}Q(k_`OzV!7l1d@-lCjpDERX71 zfy*!-R}SsIza~@Yy77&u-6EaI zZdCH++fl_L?=Tpi!a4=qXJbUCvW4gJB8@Ix$4z!CsKyf^8;swIl?g08Du8=Lg%h<~BfHp*nJ-J@JNN>OK~h(d0C zTQBTdScKiRMQT=ZOE0pYl)}j)&U36<#J0vNmOm1$e1g6)cseYjnuC%-Z|gHH4g<-c zTUf%)-n#Lx+Q|0uNtqsqN#S>6n`tF&6yaHEm&;UFBCXB2{qXjH^W-neRNz-E7ns4H zRw~vJQTY+M7|6R5*+N_E&ySW7cHb{ghbfm(J*bS((d~y;FQt*!l;o0>U@NY;54mKR zG3S0y14??*u&n#cGyiI5e=PFZ7s+=or;^CO`JC?`&3n5qhrVvy0NazKUv4*SuVT}b(jnc0dFS&KzUlKNyIhB&+pa{q zeP|iztsTXYgnV|w_fUTn#}@8o5tRZ3V$`zDheB0eD+q33|B5j=*<;{+sgY^*J^(Pv zKqZ?X-p>6~Vn_HWh}T{pxXW>-{!kzfY6BBc*XnZ9ZILdLX&=IMlbf9NEqTw$s6>N_ zKAU4-dn!y49{?vBEBkG3>oM=8FNN~dI1vqDg*Cg_f$@1*4GwFS{5}RLXz+{Dg*#O_ zKJb(a*`j=fCHI2|9#urXb1FXY$Kb$9CVF(s?G+(&sNB8)SFoP^>`2>ADmi+<7ko;L zIWA;6e$XcJWRt)fOCq%{1!`go+RAT|F>KSEI` z?mP7`jNMqAHhKo})Ftw{whLHp>7Qpzgq#un^EzQ(XsLM@EOg1swjg^GxOL z6W2FHO&$Wd5q~ZG`SOyo(7@j6tD4}Qb@!$cUlFXG=_^7)a)JInP5sXjmmZd2OG;K~ zrrbS@I&ungR^r_XAYtwm=K0n&`-3~=s5l&_yANz7?nlHgcjZlzOy(Y?KM@JKHOs;| zNE7P?lfy?LoO<&`Mh}G%2DP?Wo1JVglR>n##e{b7LIk%*d!6{CGOJ)>{7sy(Ods0C zz?kF*^7B%K%;9qp-idQqshjnd{8^e9KuD%cuW{w9$Kp#dC3gLdB&X z{$M(2zE3cv{kf0HwfT(zIbtq(J+Q&0{P*jv>5S^HyKl4D&-7&^5b*{^`(Eb% z4zKSH<&M%smE_`1hu!<8x1&xCbq7uY%CA5eUmKcGZZFs}McZ3V&yr$?V|IgHu=DNZ zw?Z37wQo=M9C)9y4q_A`0u$~K;CzF4h2l@2{u-#jJsZ2z`WvaBY59Q(yZX9%2a;!g zU=Xx^;g$DKUn7`cW(CnG3C|c}`K7r`cA4eB3nx@BW1TG6IP$(d9HWyS74sDHx9zE( ze;gn8^WfXJt5DbK1&Owo3T1WZjmnb9`{X+eg>-6H614hgmylzd`005M*s>&b*k`SU zEOPMOfdZ!@e(cO2@L7FY==Ag{vP9aZXmo|Y*{JZDnSq!Q|4hWlXI2%!;fgyfP&X-P4GrO zvAN~}uGRDpYnUiXSK`p0AvkoWzZ2+Jw^&=AEoq!m;1H`Z$-x%I;LI6Oy2muQ6k9JE z9MW%^EnKYGlRL46%YI{>1J91;wW<#Md#Kipb@53zbbIbw2l~}HHbHV3&hKQ(>$G!~ z(nob$NUe6Cm}03U6)2MdJM`k^ZWhxk9S;g#mcp>VUbZ5H>QQ=t?TGv6jX^=O8`^4R zx&09JI^_tOPDvqgO109oMe06+TJR2DV)?h5U$7619c9M>A3l%v&!a>DClv}@)eb$w zjVXZXBMq27^dU_je>Lp?a{KEzdoA!a=%U!~i(kLymuh)X79s5T!H}SQrR6~+*o{76 zkp-=)Eu-{8mCYND-_YX*!-@@bZ_(!h(OjTl+UQpz0V>IIvBH#9w_;+}zaA9}!lZ(> zcfTy8Izspumy?vOqDb6=w6q9~J2I2RP3gfBhTNvsDGQ(w!oaE1#Tn%qD4gMj{WACCI zgaFsJ7bZyL+bvDVD2PSu51}JoHxm|QjOw!*@JKos6YiR6fg(Jq{s5&9fij;Zo-AApS!bTf;tE~0Y0*Go1%w>1i ze)_#?yOkiKc-eb6w4%=8vqZAo@D(J1y?f5I-C=V4F@8=j2ri3beu&(B$817n`<0_0 zwQ#I6kJW8YPyU0yfui3h%b*up&l>X>2gG0WakR2ZTa$lX#ioSkZl_N93FVA?m$J&} z=>)HU1w56#_tpl9MZ#uN=-BnOg1ceJ=Gxjw$=Tt~KWtOCCmzSz+#E4+kae_tr=gTR zZ1?2HTJ5JeR~3XcUJs>cLM0132J+dSQAZt0Y?_eBd&==%h_9eqD<(I#*1eQN2Vf*# zC+Wp*ORY+81YRwP{$Y!ulW5)J`vn^J?fuCq*qs-5qF@RN10#R#;z$$*u;t^-;Z=ar3Ox;5W(dNq@lU3snv{>##WdQrgnP_wStw^d;(BlVWv?xCty;@OLkY?!C<`cra`{8Sp;yVIK5ufkYB1(ar zo~+nfhE~!hCNWlsB9T{-UBp$jL&H?VV6fCA+FwajG$dIhcf6x^@`+MajkKp=&o&Vq z?@b^3sm0JS8FyctH!||8Q;Zy%+1`kDkjFLDSq9kpLi~z*y;Bl)U&qA06e|@ERnrr$ zW$OER=P(UOISVlJmwwfHR&G7~T)q-nzFX#@u!O>!h!qc+AC>)qGQ;z8Si>gc1v;6p z;iZ~Y>g9@yyuxlFyz|@8%D<6;CU4ViWN-CD6IWbW{*AsQY`@(0>@&Q1t;cb1#1LPb zF9cLb-`!HiMw#xv^g429NO!fWXZnR6Ucqepd<2aWUPx2xbko=)Z|h*J=PYaZwb9Uh z(2iH4A}y3yItg4I4X@Be(QCbmtv=8R)Mjt3XKGBKeTtH3nEx_!7T=qyL7V&9bO66y z@~AJW-FGX(1Ze8_vZl;hsc0?*O;))I{9YI-@q5qRg`^)RIOr|7J|SjCsZw;R77@l; zZ1?k0EY6s8Mev&sXB2318%k!`D@2ZE7l=|+sG!3yruH{1^$!r|qQLoDoMk$lMwhME zR*MOovKf5v!hZAGBlbEbRi6nd&2{5QP1SgX2Q)cjUR^I2^&Xh;cUln3=Qm*|IdZkV zLt*x!?JLeo$h7qtrS|E$Jn~HtnBNa$S5|~kClppC>uF8LpHml%RTuBJy_kyY)+V@~ zZo?=VX$o&@=rVd_;L*lmSL09 zs)T*Xq8{ZKkx2He?N~bE9`wbT^ed>YPaVELT2B_%=0)Xy^dLWzsEbsNec`4kZE7il z4Rk9b<(FW@>4sW=q;*xO&6Ff%f`W2m+9yVRmxT-_+2ccJQYu=pYsu1|NCj{p8!4<4 z?f9$LgvfbQ)iyY3tRmVfZjoy!YWZ~Vno$`Js_&9n%Dw59kvk+{V3>B52`}(hX1WAz zn;PT9uwFJ=g@M%(E6(|p`mG?`P>;dOU{r_lN0w9mKjEhQpffX@>TZsqAm2q`Kux5t z5o~ns<#B|bP~F51LJ_DZHYY85lHldeioC+xOb>r>hsh?u2p%`Y%Iu?IPMKYK`RXJy z*Lx||rHnP1nt+IY#5`S3MG zwsbwb3tLi#bTG_|FBuFy$3MVjb_gpKM2UINorT-DIfl%5eUfBF^qp_WLfo+Uc7mgq z?81}qz7|ohf<;SHPfCdLssnA}6vJDVHr-3NNRo6fB_1Ay_MMz|!6)QpwG^0sU`4J6R%eL* z5@|zQTU}#AalkIJv9dJ(n=T<;4oFxjh~j3lEK`|3T}0gL={>DcwWWfNgoCyPKh43Q z;Da9%6ZJR_UZ5@n)A;^-VHY_Ra`(IAF5=_k+FF;!CWUmfnB+OBvb-OOqxv(caZ~B) za*6tTCAT>`ZbyZqUw@^nK3-Dx#k5+czTA176u#Qnj3Ykq(RUfWS+%GMDPl_P@81@S zpr#flij#h7vM3k0HY>{zMw-pw*og-TMWq4QW91H0?GLL21+7wHWzk0k)mv_M1~!+xU5C0Z z@ujECeb(F6scmQH0BT5|Klf^tfw+1UVz zR{9C@jA9N7VYJ0GE+wa#Kp&r}duAq>A_Ec~h2}lY0h{#v+LAF`K3nU)}Ko(Y9~Ez!J_u#VFq8-8uYDo&wF>$nBAU#oIUnT4184Rf^SK%t4nGirH8$ z5tF@+I3*^76DMNmSzQn_JH2UB%~bU9@&Nw)Y6rsmEDgn&@+ef)R-D08okSp!M!+L(;`ndY+H0*?bx58F)d+44oLH-!ky3BN zD>(5q+Z6F6@uZC_&{6E8ICiMcH@;D@E_cg ztzf%f6xsfRvTOXFN>Ham za};)t!Uj*a8(bpK=c|C@KPaebKq3%NX#b8hV89&<<=5^ZQts$>8J~igey&H&_T@Vw z8ZZ;`0XMLT)#zuD2MmJL2Q;IlJSKhxQ^X-@F_Ct6bn4EW7scuD)T8Rw zvK4>KBM!u?3C<>sC+fam@xI+en}*|2_iPG-XMxwU26X1#wSBcb1zUA-2|S~+O*K;v zuUvuM@R>z4|F)|Vl;&j)+yyoIx3kV9Fop6C694_?)>sd1x98YZ`IZ1##4$PV2WnC`;WEo^Cn9}noa(hM3u zny^la2wZqkNq7C%fQuJoK*15g^VJD3x9!dt7Nry{~>B3$VOpF!2yP zNf8KO?-U_jlD628_dtNH!g-EKqetryjlx6_X2&AlESX<6P-dE2t?E+y;qD4-;j8}7 z;b{9rZj0(kl{pScF>OKQNF7Sn30x&T{4P&^@VKn8?#+x_)?R+l5F+zYPo++m${dfO z$+T+0%L{`)JYiiJgJ~)41@kMWRj&XtSI&0BOZ-yU$xwoqbg9_xl;63EZcpm-V$Vvd zE)5F@kDNXENXQIc9%>)daIUUnlodM4}07FfQlev|r4 zx1T{|f)Q4+HZ3< zmFri>|6;%O1OFNki9oW(SUz0j_(GFk$`vuPOJNZXz6Li7wfhtg9wHKbFPDg~Xt8-O z`eSKnzK%SznO`$3M1CkLp$sJ*wxwY*;&MQmz1UaI;S#fZ+9DV{k69T*Z( ztnDGbYZ9v8ZmLN|M#5a8*f1SRrHxJV6>~EQaMqBBO?aEv$-_1i{m7uG1|1oC9D5zN zl)$HcFRW-%BQMRFiRFD#HkQBf{Wl^72}`lbOM>1qlxX_}K~L2f8g0m8N=O~%Q%oO@ ztmDe#$vos`>Ip)=)A@-mXa}WnyC#$@pz}l7OA%BRBIyo|TND@~!KOL$5XXou3D?LehDRpQFwQiKcLj}w`CS=$CzrT|gnke0&C@p`8g(KVA;~gz6c}rh znm!_n<#)`5!~Hsjs3!ybcGheB(AJav+!nCk*ZYQ8Db=;wP4F#LEGvqpKe!>ewtAm5 z`F3FD{F3hyLOJC$*6Kc2@7ug2DnmtoQvPORQvTMfD28naqwLbLv%2!>0lS#@MO?i} zFtld~eMSN~gg!k|Bzk7*v&A5dY(iSo{0N1XSdK-*(2uxvhxBnBw&xB8KXMjYcNd$_ z5`3l_FY=r+oaQYq0*X)RG1ZJ+rIsuyv{-3(_gjs*Rzp4d@Fp}Ol^JcLs_`914ORW` z>~>{%LtlD$d($^ekcq9IFD<%Cb(yuNJoAGNTA*3L9o%Pz-!g)0Gw+w*q(J^$RcSO< zZYP_bovHoNgJ3ZhVL80TxLc5x-6ozRa^)JU;*&As99H;RB7AO^?{SZ=zi1y*e|=jz z-biHRgtxv>w9@J>O4d#?A^eBx9(t*-Q^Q+!a-qhaIG2MQs zQKJuj#KXyQBA-fnYRVbk8-=>qC5tQSwXxqaRu9F0qK}wr^cPnTL>r6d9%G}Q(5g!fG9Hwe3z|dHp^^GQ^Pg1BInz5r&490G8w0n+OFzxkp;I|fL8 z=q|;3pptwCaLLA(VDAaa2^N{wdr1abvh&N4n~s(Ibb)2j34a*CCs`I8N$@Go_9Z@_&;f%~K-7;>mq& z?aPf6`5|;z+77RfqH{1%SN)38HQO&!%(`0^*j6DEGx`>s=_IP_mlG(N*;B3zo*~?$wR#&ptNS&~fkVx)3H5+Z!(? zd2tneDQ5X(mx#%Mrb470C7;V%48wp%C7$QkZbxx_s0Q_IbBjIB3q+p%Xo2j*k$EAT zs4s|$Evo8`h*3YE*?(edr%-L*WWMUp@$juX=E!au*0$0411}{@k=?P;%@y!1J zD&9pY@0ugt%V6CDawrQfjNrmz2;Mu=!s-pw8Caz-$~)4r(T?@a$vhms<~?C0#)u89 z(YutCTFyu1V!1{$IE0!h)4wzy@BnFJYf65s9sJzdhkrVs1?Px9Ns^o<{i#UFg&E%Q zj!F&%rM{BM^1@*K+3s?*f+F1@1f26Q*`|{?4rs%Flmq~+4 zjB<3N9kR;=K3vLY~tB=WtVs+;-J>?l}&^ zL6XNpL!8UqwF|Y08$vBhD^pJm4<`;hcTX~eR-vn8 zDYt8UL$R*H&(QECsdeAMGAWLsPN8A@K?WAT#?VC4%hv5Z%wkFF8&kvRw#YCIFh4P* zFkihy@QY%i-!ltKsI&JsW}@A=qD}ce{*IQV9?75x-B!+;ge%(4x8=`2t2{gwxHFji zm85V25N4NhsQsfv=0z<1$8oC_s1J^+MV!h>h{l6{k$YFWTM|h9lretZT%i`bzqlzc-zSwI9^l4)mH#Ok z#rVBKq{|EpZ+*Xg61Mqvu<;#k62a^`&2?oyMOY;LY$8O(oo$|5m${;9qB7Q!%wot} zp_|K=2u(CQ-#NqC*jTkIW)r>TOp{E<&(&xSB`jSW4nPS*X{sM)qniT;TbZS}F)ym6A`M2p=9V+50p56{N z^Es5B-HW6yj5Un(Y-Qi+$GJCM((;kFat{?o_tG;J2^?K~!#t=Y(5OEtU2wU>lzW?j zcEYWI+#&h~AS^ecKye~V8>iogX|lg^czfR7li!2axC!UHK{~oABt%Lwb-U3mFV3jV zD9-$9%CGQq!!cztcs@JSaHsH{@v6O}+RhNEfP zApI?!h>E3F3ai;xrwk6I8jhBZD*mHgEnH>v?=F#q4phr-9M%;Y9GER7s-$58#xra< z{s?YVV`|wHFTP^3#&aO!Tu1n3G{$|mnfS}I@UB@klP3?pqS+u>nasTA0&6Fw_MiN$73uoXiawfIoPL34$W^y?eIr2R3`+-pWn9GcD2YA%r8i zp{JzxNZFJ5X4^+K^e2_9>gt~Y96LMWEa#+C(8jf{Rq07_?Cx)ujhJ5ku1lT&WXv)o zyWL^bO78WhX;di`|0H^lui1>biJ#<47i$`4x4}2Un}|Cvc~}~$;*)MoIk)%{l`0W3 zVz>`Y8o`NJ!bI953=BG>xW9aj;fpZqO)WK`* zM}_7m9!|100b;;j!@~4FP*qyilCWZj}ab8JOjtpZSQ|PtL z+leyv0i^_$R&3BjWE-eXuvdNXmTQ*>;TPR*6B5M;+7HC4K8Zy97;_k%(>T*z&pMkV zBE;71-ImOHph}mW6)5?RP$jI{^uzE_sD0S;>1a&>9P2=-;g@vXKj-$orrL&2JefI) zG&$K%;5|4$tr-0n=($+nhYI}6P4o>P+8Q$a?!`bs!1;wPvcuJU?Kak8v7cP}Ga-!R zUN^D3Jm@TjEa=tMr4D*POVNyfboG4^^dAaqSk)l}!dg=H(5q|L3`Gq}EHk38G z4Wp_1Q#jYsn@R*mVwABH2@4UPO0#v{Hcg46UM^a7$c5V?$mpOCH^o zCc^rWawQxub8~67{%73J;M#TLr zL~b>_YdPlxKY3XOk!UQ1oxS)cG*x3q+MDq@#aYs=Ndu4m%k;~dWD18OE03BY_=NitI0<_ylE;Hbce+k?%HQr<1g46|t74g)h)_^DK!Qoo zoi1q+ML~LT8Bs4-lgWzOvg|c3%)@T&DWd#U z;fON$uxjZc8B0ooa`a1tmwX*c)ktLD#8@x9FuxV@th{!={o#&T#-~n=a*9lzv^#ch zbH03kt5vq~q()lLuFGpy^}EsQpjNV`KBi}m+)r4){}`^>G2OH+{QP9zNgZJyt6HB; zWS(sfL+OS)WfCger$C~w&(p(JQp9B%VRLJeQoqUbjnwNmI=17<*P*{aQTaq;*QW2| zXu3e!fgMn;lic1!)DH9Ys>J6?ud%T)9n;q{Ql0)vH`=D^$2WKFmg-S1`Ec=~4a7hD z!kTqkN0(+IFfYJMtK@b5><7lXvlQ3OInX%zU?*zMo4-4T}JLeQHe7&(Q!@j%@4&0Po8|6Ge0P>UxPT7 z)~IDtZe$(hc_qlhXQ&q?;qIjlW2rR7JN#4c`wE$LW69a*RZuz#U4snSsdf=UE*q&% zFqGfRQ8Cfs8i{;*Dfa6Vyk{O*xXEaWe0SkZ{M`ERmjg;)&fdhOW3X1l&!*hT<7V02jXrf?<(PSw3i-^@}pM@3X zwAkh7(NJXGl+ooY(|Yc$n!E0?lUgOg0+f{IUeG;^+t1d?3LPFq6`3lj(H5uG z@U1w=Rah^58pQ22vlFf8Q4_2x@%vsPs_tWf(nu$LiMV=(sgP&B{U;gBfi^a4f_D_n zPG9CKBNNk)wDcS*+-+wn=TWJW$~iVSf*)>rSXfc_6z#6NM$3%f&05HHU%SrH^frYK@c$!_^pWr{1{$TennMTK~Jn z1XYUlGVFBMgmSb7a_SjI>oABIbogLc&^WWF6JYKoUa2Fq<-CTNmle&5V?J}Af05WG zpgj+rWErPaI4Dcn!x8Q+cX6YF3pq-se=n6M@4$4KxKd9-37f}^;b3QM)fa?*ci8RA zw3LwyKN5tcx`w%n6azbaqhsH2zxjz%+cG+nZYwpDPLelH{UJ2($y!AAYJhq~)LXcC zjza58f*-CP=Iaipmx(IFcj`E?tQ`(xp#;R=!8U=%Me168{`5Mm17c9vGPawK0WRep z!%sr4(rd;@s9TRz-R0rd`q5IvmDgx3n}T2236pF8!Y-A-JylScXi97Ad;GYW zQfb$XAPXZOX^F?KLHSy~R3DMlMlC6-z8YwHEN+LW34gw-zaD-S^;UKa$vus)P9)AF z$*9`6cjtuzOhxa@ZL-{#b3IH)l9GJ;1S%sq3YRn}#mDiG$%x1vM`zTL&^e?=@^a>a z#M3R?{L2|h#c^BcgSX_&q9YYbA51A2)qO8sN(8n+?26Co_#TRF8Mal|a9-L%d&ycQ zpY_Nr8pQ#D`kCq8SW&}^^o>s#%DFSRjSrqZq{cFn{W9d z(~RQAmux28Sb}$+4l-(!Pa6yL?=lIamH-dt)9kGJ&4lfhv%@ooh}P!Zh3_PUiXQsC1$K4tC_HCDtbP_q_pQIeAUVl zep25xRRjk_r3b9G4(r=ynS4IB32B$BCvaeHAQ!WFeU*E%ZHug|+`+nDp^X%Ib%}0t z5GS9Gp1o^V@tF-%WlsIeODfK!vk2fSid&2ntCi~uTo=!NE6_Vdi+dm}5E zq#EnX$>xd__$46|PhtdDJ)~=>J{Ls}<%tGo7-OwXIwoC{4o2I~%rxG8pq+GIy&<^E zhGA;-Q|{N^sy&A*qRaaI)H&GE#)H(v)c4E=3BIxH3Md=dz49-%nt9FJ!g$yeRF?bG za>9hQLZ&^y$(db|Wz*5VD8t%g2qs9-^mBUho>KWS0bPBz1(ah@} z)vi@1#Y;b)==jQ0KacEvfZ0$WP&&8FTQcUN-5|7ZOZ*$GyB}^ZdjAu@_q^f3Ilgp1 zf<-QSQCbJeY|?!nSDCP5ZFP%0D7w0g;lZDXXggTSJ4z73oVpY=&sM2;OOcLmyBF$k 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 V;XsI~z<bz@8E6{{ePDU>E=Z literal 0 HcmV?d00001 diff --git a/src/org/scada_lts/config/ScadaConfig.java b/src/org/scada_lts/config/ScadaConfig.java index a509ff4726..82bddde3a5 100644 --- a/src/org/scada_lts/config/ScadaConfig.java +++ b/src/org/scada_lts/config/ScadaConfig.java @@ -20,6 +20,8 @@ import com.serotonin.mango.Common; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.scada_lts.mango.service.SystemSettingsService; +import org.scada_lts.web.mvc.api.css.CssStyle; import java.io.File; import java.io.FileInputStream; @@ -148,6 +150,7 @@ public class ScadaConfig { private static final String FILE_NAME_PROPERTIES="env.properties"; private static final String FILE_NAME_CUSTOM_CSS="common.css"; private static final String DIR_NAME_CUSTOM_CONFIG="assets"; + private static final String FILE_NAME_USER_STYLESHEET="user_styles.css"; private static ScadaConfig instance = null; @@ -322,6 +325,11 @@ public static boolean isExistCustomEnvProperties() { File f = new File(getPathCustomConfig()+FILE_NAME_PROPERTIES); return (f.exists()) && (!f.isDirectory()); } + + public static boolean isExistUserCSS() { + File f = new File(getPathCustomConfig()+FILE_NAME_USER_STYLESHEET); + return (f.exists()) && (!f.isDirectory()); + } public static void copyLogo() { try { @@ -346,6 +354,16 @@ public static void copyConfig() { LOG.error(e); } } + + public static void copyUserCSS() { + try { + SystemSettingsService systemSettingsService = new SystemSettingsService(); + CssStyle cssContent = systemSettingsService.getCustomCss(); + Files.write(Paths.get(getPathCustomConfig() + FILE_NAME_USER_STYLESHEET), cssContent.getContent().getBytes()); + } catch (IOException e) { + LOG.error(e); + } + } private ScadaConfig() { try { @@ -425,5 +443,17 @@ private static String getPathCustomConfig() { } + private static String getPathExistingUserCSS() { + String fileSeparator = System.getProperty("file.separator"); + String path = Common.ctx.getServletContext().getRealPath(""); + + if (fileSeparator.equals("\\")) { + path = path + "\\assets\\user_styles.css"; + } + if (fileSeparator.equals("/")) { + path = path + "/assets/user_styles.css"; + } + return path; + } } diff --git a/src/org/scada_lts/dao/SystemSettingsDAO.java b/src/org/scada_lts/dao/SystemSettingsDAO.java index 12aa9edcce..60ad3d993c 100644 --- a/src/org/scada_lts/dao/SystemSettingsDAO.java +++ b/src/org/scada_lts/dao/SystemSettingsDAO.java @@ -166,6 +166,7 @@ public class SystemSettingsDAO { public static final String EVENT_ASSIGN_ENABLED = "eventAssignEnabled"; public static final String TOP_DESCRIPTION_PREFIX = "topDescriptionPrefix"; public static final String TOP_DESCRIPTION = "topDescription"; + public static final String CUSTOM_CSS = "customCss"; // @formatter:off private static final String SELECT_SETTING_VALUE_WHERE = "" @@ -418,6 +419,7 @@ public String getDatabaseSchemaVersion(String key, String defaultValue) { DEFAULT_VALUES.put(EVENT_ASSIGN_ENABLED, SystemSettingsUtils.isEventAssignEnabled()); DEFAULT_VALUES.put(TOP_DESCRIPTION, ""); DEFAULT_VALUES.put(TOP_DESCRIPTION_PREFIX, ""); + DEFAULT_VALUES.put(CUSTOM_CSS, ""); } @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED, rollbackFor = SQLException.class) diff --git a/src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java b/src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java new file mode 100644 index 0000000000..dab1ce0a9d --- /dev/null +++ b/src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java @@ -0,0 +1,36 @@ +package org.scada_lts.dao.migration.mysql; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.flywaydb.core.api.migration.BaseJavaMigration; +import org.flywaydb.core.api.migration.Context; +import org.scada_lts.dao.DAO; +import org.springframework.jdbc.core.JdbcTemplate; + +public class V2_8_0_3_AddCustomCssColumnToSystemSettings extends BaseJavaMigration { + + private static final Log LOG = LogFactory.getLog(V2_8_0_3_AddCustomCssColumnToSystemSettings.class); + + @Override + public void migrate(Context context) throws Exception { + final JdbcTemplate jdbcTmp = DAO.getInstance().getJdbcTemp(); + + try { + addCustomCssColumn(jdbcTmp); + } catch (Exception ex) { + LOG.error(ex.getMessage(), ex); + throw ex; + } + } + + private void addCustomCssColumn(JdbcTemplate jdbcTmp) { + boolean existsCustomCssColumn = jdbcTmp.queryForObject( + "SELECT (SELECT `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA`= DATABASE() AND `TABLE_NAME`='systemSettings' AND `COLUMN_NAME`='customCss') IS NOT NULL;", + boolean.class + ); + + if (!existsCustomCssColumn) { + jdbcTmp.update("ALTER TABLE systemSettings ADD COLUMN customCss TEXT DEFAULT NULL;"); + } + } +} diff --git a/src/org/scada_lts/mango/adapter/MangoScadaConfig.java b/src/org/scada_lts/mango/adapter/MangoScadaConfig.java index 4781584670..9682cc3984 100644 --- a/src/org/scada_lts/mango/adapter/MangoScadaConfig.java +++ b/src/org/scada_lts/mango/adapter/MangoScadaConfig.java @@ -55,6 +55,11 @@ public void init() { LOG.info("copy env.properties"); ScadaConfig.copyConfig(); } + + if(ScadaConfig.isExistUserCSS()){ + LOG.info("copy user_styles"); + ScadaConfig.copyUserCSS(); + } } diff --git a/src/org/scada_lts/mango/service/SystemSettingsService.java b/src/org/scada_lts/mango/service/SystemSettingsService.java index a1c1e889d9..92921b062c 100644 --- a/src/org/scada_lts/mango/service/SystemSettingsService.java +++ b/src/org/scada_lts/mango/service/SystemSettingsService.java @@ -24,6 +24,7 @@ import org.scada_lts.utils.SystemSettingsUtils; import org.scada_lts.web.beans.ApplicationBeans; import org.scada_lts.web.mvc.api.AggregateSettings; +import org.scada_lts.web.mvc.api.css.CssStyle; import org.scada_lts.web.mvc.api.json.*; import org.springframework.stereotype.Service; @@ -519,4 +520,12 @@ private static Map deserializeMap(String json) { return Collections.emptyMap(); } } + + public CssStyle getCustomCss() { + return new CssStyle(SystemSettingsDAO.getValue(SystemSettingsDAO.CUSTOM_CSS)); + } + + public void saveCustomCss(CssStyle cssStyle){ + systemSettingsDAO.setValue(SystemSettingsDAO.CUSTOM_CSS, cssStyle.getContent()); + } } diff --git a/src/org/scada_lts/web/mvc/api/CustomCssAPI.java b/src/org/scada_lts/web/mvc/api/CustomCssAPI.java index 0fa9823069..337f51705d 100644 --- a/src/org/scada_lts/web/mvc/api/CustomCssAPI.java +++ b/src/org/scada_lts/web/mvc/api/CustomCssAPI.java @@ -1,80 +1,67 @@ package org.scada_lts.web.mvc.api; -import com.serotonin.mango.Common; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.scada_lts.mango.service.SystemSettingsService; +import org.scada_lts.serorepl.utils.StringUtils; import org.scada_lts.web.mvc.api.css.CssStyle; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; -import java.io.*; +import javax.validation.Valid; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.nio.file.Files; -@Controller +import static org.scada_lts.web.mvc.api.css.CssUtils.getCustomCssFileFromPath; +import static org.scada_lts.web.mvc.api.css.CssUtils.saveToFile; + +@RestController @RequestMapping("/api/customcss") public class CustomCssAPI { private static final Log LOG = LogFactory.getLog(CustomCssAPI.class); - private static final String CSS_FILENAME = "/assets/user_styles.css"; - private static final String REQ_RESP_ERROR = "Couldn't create a *.css file."; - @GetMapping("/") - public ResponseEntity getCustomCssFile(HttpServletRequest request) { + private final SystemSettingsService systemSettingsService; + + public CustomCssAPI(SystemSettingsService systemSettingsService) { + this.systemSettingsService = systemSettingsService; + } + + @GetMapping("") + public ResponseEntity getCustomCss(HttpServletRequest request) { LOG.info("GET: /api/customcss"); try { - File cssFile = getCustomCssFileFromPath(); - if(cssFile != null) { - String content = Files.readString(cssFile.toPath()); - return new ResponseEntity<>(new CssStyle(content), HttpStatus.OK); - } else { - return new ResponseEntity<>(REQ_RESP_ERROR,HttpStatus.INTERNAL_SERVER_ERROR); + CssStyle customCss = systemSettingsService.getCustomCss(); + if (!StringUtils.isEmpty(customCss.getContent())) { + return new ResponseEntity<>(customCss, HttpStatus.OK); } + return new ResponseEntity<>(REQ_RESP_ERROR,HttpStatus.BAD_REQUEST); } catch (Exception e) { LOG.error(e); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } } - @PostMapping("/") - public ResponseEntity saveCustomCssFile(HttpServletRequest request, @RequestBody String fileContent) { + @PostMapping("") + public ResponseEntity saveCustomCss(HttpServletRequest request, @Valid @RequestBody(required = true) CssStyle cssStyle) { LOG.info("POST: /api/customcss"); try { - File cssFile = getCustomCssFileFromPath(); - if(cssFile != null) { - try (BufferedWriter writer = new BufferedWriter(new FileWriter(cssFile.getAbsolutePath()))) { - writer.write(fileContent); - } + if(!StringUtils.isEmpty(cssStyle.getContent())) { + systemSettingsService.saveCustomCss(cssStyle); + saveToFile(cssStyle); return new ResponseEntity<>(HttpStatus.OK); - } else { - return new ResponseEntity<>(REQ_RESP_ERROR, HttpStatus.INTERNAL_SERVER_ERROR); } + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } catch (Exception e) { LOG.error(e); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } } - - private File getCustomCssFileFromPath() { - try { - File cssFile = new File(Common.ctx.getCtx().getRealPath(CSS_FILENAME)); - if(!cssFile.exists()) { - boolean created = cssFile.createNewFile(); - if(created) { - LOG.info("Created custom CSS stylesheet file: " + CSS_FILENAME); - } - } - return cssFile; - } catch (IOException e) { - LOG.error("Could not create a custom CSS file: " + CSS_FILENAME); - } - return null; - } } diff --git a/src/org/scada_lts/web/mvc/api/css/CssStyle.java b/src/org/scada_lts/web/mvc/api/css/CssStyle.java index a969130d35..48450487f4 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssStyle.java +++ b/src/org/scada_lts/web/mvc/api/css/CssStyle.java @@ -1,7 +1,11 @@ package org.scada_lts.web.mvc.api.css; +@CssValid public class CssStyle { - private final String content; + private String content; + + public CssStyle() { + } public CssStyle(String content) { this.content = content; diff --git a/src/org/scada_lts/web/mvc/api/css/CssUtils.java b/src/org/scada_lts/web/mvc/api/css/CssUtils.java new file mode 100644 index 0000000000..043290e983 --- /dev/null +++ b/src/org/scada_lts/web/mvc/api/css/CssUtils.java @@ -0,0 +1,49 @@ +package org.scada_lts.web.mvc.api.css; + +import com.serotonin.mango.Common; +import com.serotonin.mango.util.LoggingUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.scada_lts.web.mvc.api.CustomCssAPI; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class CssUtils { + + private static final Log LOG = LogFactory.getLog(CssUtils.class); + private static final String CSS_FILENAME = "/assets/user_styles.css"; + + public static boolean saveToFile(CssStyle cssStyle) { + try { + File customCssFile = getCustomCssFileFromPath(); + if (customCssFile != null) { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(customCssFile.getAbsolutePath()))) { + writer.write(cssStyle.getContent()); + } + } + return true; + } catch (Exception ex) { + LOG.warn(LoggingUtils.exceptionInfo(ex)); + return false; + } + } + + public static File getCustomCssFileFromPath() { + try { + File cssFile = new File(Common.ctx.getCtx().getRealPath(CSS_FILENAME)); + if(!cssFile.exists()) { + boolean created = cssFile.createNewFile(); + if(created) { + LOG.info("Created custom CSS stylesheet file: " + CSS_FILENAME); + } + } + return cssFile; + } catch (IOException e) { + LOG.error("Could not create a custom CSS file: " + CSS_FILENAME); + } + return null; + } +} diff --git a/src/org/scada_lts/web/mvc/api/css/CssValid.java b/src/org/scada_lts/web/mvc/api/css/CssValid.java new file mode 100644 index 0000000000..29caf639c2 --- /dev/null +++ b/src/org/scada_lts/web/mvc/api/css/CssValid.java @@ -0,0 +1,16 @@ +package org.scada_lts.web.mvc.api.css; + + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = CssValidator.class) +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface CssValid { + String message() default "Wrong Css format detected"; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git a/src/org/scada_lts/web/mvc/api/css/CssValidator.java b/src/org/scada_lts/web/mvc/api/css/CssValidator.java new file mode 100644 index 0000000000..7a288dc924 --- /dev/null +++ b/src/org/scada_lts/web/mvc/api/css/CssValidator.java @@ -0,0 +1,53 @@ +package org.scada_lts.web.mvc.api.css; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; + +public class CssValidator implements ConstraintValidator { + + private static final String VALIDATOR_API_URL = "https://jigsaw.w3.org/css-validator/validator?profile=css3&output=json&text="; + + @Override + public void initialize(CssValid constraintAnnotation) { + } + + @Override + public boolean isValid(CssStyle value, ConstraintValidatorContext context) { + if (value == null || value.getContent().trim().isEmpty()) { + return false; + } + + try { + HttpClient client = HttpClient.newHttpClient(); + String cssContent = value.getContent(); + String encodedCssContent = java.net.URLEncoder.encode(cssContent, StandardCharsets.UTF_8); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(VALIDATOR_API_URL + encodedCssContent)) + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + String responseBody = response.body(); + + + if (responseBody.contains("\"errorcount\" : 0")) { + return true; + } else { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate("CSS contains validation errors").addConstraintViolation(); + return false; + } + + } catch (Exception e) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate("Error validating CSS: " + e.getMessage()).addConstraintViolation(); + return false; + } + } +} \ No newline at end of file diff --git a/test/org/scada_lts/web/security/XssProtectHtmlEscapeUtilsTest.java b/test/org/scada_lts/web/security/CssProtectHtmlEscapeUtilsTest.java similarity index 95% rename from test/org/scada_lts/web/security/XssProtectHtmlEscapeUtilsTest.java rename to test/org/scada_lts/web/security/CssProtectHtmlEscapeUtilsTest.java index 668c8e2d8f..bb3cab9bea 100644 --- a/test/org/scada_lts/web/security/XssProtectHtmlEscapeUtilsTest.java +++ b/test/org/scada_lts/web/security/CssProtectHtmlEscapeUtilsTest.java @@ -10,7 +10,7 @@ @RunWith(Parameterized.class) -public class XssProtectHtmlEscapeUtilsTest { +public class CssProtectHtmlEscapeUtilsTest { @Parameterized.Parameters(name = "{index}: content: {0}, expected: {1}") public static List data() { @@ -45,7 +45,7 @@ public static List data() { private final String content; private final String expected; - public XssProtectHtmlEscapeUtilsTest(String content, String expected) { + public CssProtectHtmlEscapeUtilsTest(String content, String expected) { this.content = content; this.expected = expected; } From a85e000c46c6a1fac6c3b60eab63a04b81b7bb7d Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Fri, 13 Sep 2024 18:04:42 +0200 Subject: [PATCH 32/63] #2995 Added saving custom stylesheet to the database --- src/org/scada_lts/config/ScadaConfig.java | 11 ++---- src/org/scada_lts/dao/SystemSettingsDAO.java | 5 ++- ..._3_AddCustomCssColumnToSystemSettings.java | 25 +++++++----- .../scada_lts/web/mvc/api/CustomCssAPI.java | 6 --- .../scada_lts/web/mvc/api/css/CssUtils.java | 10 ++++- .../web/mvc/api/css/CssValidator.java | 39 +------------------ ...ava => XssProtectHtmlEscapeUtilsTest.java} | 4 +- 7 files changed, 34 insertions(+), 66 deletions(-) rename test/org/scada_lts/web/security/{CssProtectHtmlEscapeUtilsTest.java => XssProtectHtmlEscapeUtilsTest.java} (95%) diff --git a/src/org/scada_lts/config/ScadaConfig.java b/src/org/scada_lts/config/ScadaConfig.java index 82bddde3a5..1f776d3c38 100644 --- a/src/org/scada_lts/config/ScadaConfig.java +++ b/src/org/scada_lts/config/ScadaConfig.java @@ -22,6 +22,7 @@ import org.apache.commons.logging.LogFactory; import org.scada_lts.mango.service.SystemSettingsService; import org.scada_lts.web.mvc.api.css.CssStyle; +import org.scada_lts.web.mvc.api.css.CssUtils; import java.io.File; import java.io.FileInputStream; @@ -356,13 +357,9 @@ public static void copyConfig() { } public static void copyUserCSS() { - try { - SystemSettingsService systemSettingsService = new SystemSettingsService(); - CssStyle cssContent = systemSettingsService.getCustomCss(); - Files.write(Paths.get(getPathCustomConfig() + FILE_NAME_USER_STYLESHEET), cssContent.getContent().getBytes()); - } catch (IOException e) { - LOG.error(e); - } + SystemSettingsService systemSettingsService = new SystemSettingsService(); + CssStyle cssContent = systemSettingsService.getCustomCss(); + CssUtils.saveToFile(cssContent); } private ScadaConfig() { diff --git a/src/org/scada_lts/dao/SystemSettingsDAO.java b/src/org/scada_lts/dao/SystemSettingsDAO.java index 60ad3d993c..58f0d7ffa6 100644 --- a/src/org/scada_lts/dao/SystemSettingsDAO.java +++ b/src/org/scada_lts/dao/SystemSettingsDAO.java @@ -28,6 +28,7 @@ import org.scada_lts.utils.ColorUtils; import org.scada_lts.utils.SystemSettingsUtils; import org.scada_lts.web.mvc.api.AggregateSettings; +import org.scada_lts.web.mvc.api.css.CssUtils; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; @@ -419,8 +420,8 @@ public String getDatabaseSchemaVersion(String key, String defaultValue) { DEFAULT_VALUES.put(EVENT_ASSIGN_ENABLED, SystemSettingsUtils.isEventAssignEnabled()); DEFAULT_VALUES.put(TOP_DESCRIPTION, ""); DEFAULT_VALUES.put(TOP_DESCRIPTION_PREFIX, ""); - DEFAULT_VALUES.put(CUSTOM_CSS, ""); - } + DEFAULT_VALUES.put(CUSTOM_CSS, "" ); + } @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED, rollbackFor = SQLException.class) public void resetDataBase() { diff --git a/src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java b/src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java index dab1ce0a9d..3a0ef90498 100644 --- a/src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java +++ b/src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java @@ -7,6 +7,12 @@ import org.scada_lts.dao.DAO; import org.springframework.jdbc.core.JdbcTemplate; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +import static org.scada_lts.web.mvc.api.css.CssUtils.getCustomCssFileFromPath; + public class V2_8_0_3_AddCustomCssColumnToSystemSettings extends BaseJavaMigration { private static final Log LOG = LogFactory.getLog(V2_8_0_3_AddCustomCssColumnToSystemSettings.class); @@ -16,21 +22,22 @@ public void migrate(Context context) throws Exception { final JdbcTemplate jdbcTmp = DAO.getInstance().getJdbcTemp(); try { - addCustomCssColumn(jdbcTmp); + updateCustomCssContent(jdbcTmp); } catch (Exception ex) { LOG.error(ex.getMessage(), ex); throw ex; } } - private void addCustomCssColumn(JdbcTemplate jdbcTmp) { - boolean existsCustomCssColumn = jdbcTmp.queryForObject( - "SELECT (SELECT `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA`= DATABASE() AND `TABLE_NAME`='systemSettings' AND `COLUMN_NAME`='customCss') IS NOT NULL;", - boolean.class - ); - - if (!existsCustomCssColumn) { - jdbcTmp.update("ALTER TABLE systemSettings ADD COLUMN customCss TEXT DEFAULT NULL;"); + private void updateCustomCssContent(JdbcTemplate jdbcTmp) { + try { + File customCssFile = getCustomCssFileFromPath(); + if (customCssFile != null && customCssFile.exists()) { + String customCssContent = new String(Files.readAllBytes(customCssFile.toPath())); + jdbcTmp.update("UPDATE systemSettings SET customCss = ?", customCssContent); + } + } catch (IOException e) { + LOG.error("Error reading custom CSS file: " + e.getMessage(), e); } } } diff --git a/src/org/scada_lts/web/mvc/api/CustomCssAPI.java b/src/org/scada_lts/web/mvc/api/CustomCssAPI.java index 337f51705d..4f925fdef2 100644 --- a/src/org/scada_lts/web/mvc/api/CustomCssAPI.java +++ b/src/org/scada_lts/web/mvc/api/CustomCssAPI.java @@ -11,13 +11,7 @@ import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Files; -import static org.scada_lts.web.mvc.api.css.CssUtils.getCustomCssFileFromPath; import static org.scada_lts.web.mvc.api.css.CssUtils.saveToFile; @RestController diff --git a/src/org/scada_lts/web/mvc/api/css/CssUtils.java b/src/org/scada_lts/web/mvc/api/css/CssUtils.java index 043290e983..e9a0478c2c 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssUtils.java +++ b/src/org/scada_lts/web/mvc/api/css/CssUtils.java @@ -4,12 +4,17 @@ import com.serotonin.mango.util.LoggingUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.scada_lts.web.mvc.api.CustomCssAPI; +import org.scada_lts.utils.PathSecureUtils; +import org.scada_lts.utils.UploadFileUtils; +import javax.servlet.ServletContext; +import javax.swing.text.html.CSS; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; public class CssUtils { @@ -33,7 +38,8 @@ public static boolean saveToFile(CssStyle cssStyle) { public static File getCustomCssFileFromPath() { try { - File cssFile = new File(Common.ctx.getCtx().getRealPath(CSS_FILENAME)); + Path fileName = PathSecureUtils.getAppContextSystemFilePath(CSS_FILENAME); + File cssFile = new File(fileName.toUri()); if(!cssFile.exists()) { boolean created = cssFile.createNewFile(); if(created) { diff --git a/src/org/scada_lts/web/mvc/api/css/CssValidator.java b/src/org/scada_lts/web/mvc/api/css/CssValidator.java index 7a288dc924..7df463a9e3 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssValidator.java +++ b/src/org/scada_lts/web/mvc/api/css/CssValidator.java @@ -2,52 +2,15 @@ import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.nio.charset.StandardCharsets; public class CssValidator implements ConstraintValidator { - private static final String VALIDATOR_API_URL = "https://jigsaw.w3.org/css-validator/validator?profile=css3&output=json&text="; - @Override public void initialize(CssValid constraintAnnotation) { } @Override public boolean isValid(CssStyle value, ConstraintValidatorContext context) { - if (value == null || value.getContent().trim().isEmpty()) { - return false; - } - - try { - HttpClient client = HttpClient.newHttpClient(); - String cssContent = value.getContent(); - String encodedCssContent = java.net.URLEncoder.encode(cssContent, StandardCharsets.UTF_8); - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(VALIDATOR_API_URL + encodedCssContent)) - .build(); - - HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - - String responseBody = response.body(); - - - if (responseBody.contains("\"errorcount\" : 0")) { - return true; - } else { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate("CSS contains validation errors").addConstraintViolation(); - return false; - } - - } catch (Exception e) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate("Error validating CSS: " + e.getMessage()).addConstraintViolation(); - return false; - } + return value != null && !value.getContent().trim().isEmpty(); } } \ No newline at end of file diff --git a/test/org/scada_lts/web/security/CssProtectHtmlEscapeUtilsTest.java b/test/org/scada_lts/web/security/XssProtectHtmlEscapeUtilsTest.java similarity index 95% rename from test/org/scada_lts/web/security/CssProtectHtmlEscapeUtilsTest.java rename to test/org/scada_lts/web/security/XssProtectHtmlEscapeUtilsTest.java index bb3cab9bea..668c8e2d8f 100644 --- a/test/org/scada_lts/web/security/CssProtectHtmlEscapeUtilsTest.java +++ b/test/org/scada_lts/web/security/XssProtectHtmlEscapeUtilsTest.java @@ -10,7 +10,7 @@ @RunWith(Parameterized.class) -public class CssProtectHtmlEscapeUtilsTest { +public class XssProtectHtmlEscapeUtilsTest { @Parameterized.Parameters(name = "{index}: content: {0}, expected: {1}") public static List data() { @@ -45,7 +45,7 @@ public static List data() { private final String content; private final String expected; - public CssProtectHtmlEscapeUtilsTest(String content, String expected) { + public XssProtectHtmlEscapeUtilsTest(String content, String expected) { this.content = content; this.expected = expected; } From 017cd0c84f321a0bf9da63b9a38a7692c29bf970 Mon Sep 17 00:00:00 2001 From: Kamil Date: Tue, 17 Sep 2024 03:10:40 +0200 Subject: [PATCH 33/63] #2995 dded saving custom stylesheet to the database: - added property in env.properties: systemsettings.custom.css.content; - removed V2_8_0_3_AddCustomCssColumnToSystemSettings; - default load from property systemsettings.custom.css.content; - corrected init: get css content from database and save to file assets/user_styles.css; - corrected @CssValid target to String; - defined jackson constructor for CssStyle with content, added method clearedOfTabs; - renamed class from CssUtils to CustomCssUtils; --- WebContent/WEB-INF/jsp/include/highlight.jsp | 3 -- WebContent/WEB-INF/jsp/systemSettings.jsp | 2 +- src/org/scada_lts/config/ScadaConfig.java | 27 ------------ src/org/scada_lts/dao/SystemSettingsDAO.java | 5 +-- ..._3_AddCustomCssColumnToSystemSettings.java | 43 ------------------- .../mango/adapter/MangoScadaConfig.java | 11 +++-- .../mango/service/SystemSettingsService.java | 7 +-- .../scada_lts/utils/SystemSettingsUtils.java | 11 +++++ .../scada_lts/web/mvc/api/CustomCssAPI.java | 13 +++--- .../scada_lts/web/mvc/api/css/CssStyle.java | 19 +++++--- .../scada_lts/web/mvc/api/css/CssValid.java | 2 +- .../web/mvc/api/css/CssValidator.java | 6 +-- .../{CssUtils.java => CustomCssUtils.java} | 30 +++++++------ webapp-resources/env.properties | 2 + 14 files changed, 68 insertions(+), 113 deletions(-) delete mode 100644 src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java rename src/org/scada_lts/web/mvc/api/css/{CssUtils.java => CustomCssUtils.java} (58%) diff --git a/WebContent/WEB-INF/jsp/include/highlight.jsp b/WebContent/WEB-INF/jsp/include/highlight.jsp index 1f2d229dc4..41ad467f82 100644 --- a/WebContent/WEB-INF/jsp/include/highlight.jsp +++ b/WebContent/WEB-INF/jsp/include/highlight.jsp @@ -15,9 +15,6 @@ function updateCodeText(text, destination) { function updateCodeTextEscaped(text, destination) { let result_element = document.querySelector(destination); - if(text[text.length-1] == "\n") { - text += " "; - } result_element.innerHTML = text; hljs.highlightElement(result_element); } diff --git a/WebContent/WEB-INF/jsp/systemSettings.jsp b/WebContent/WEB-INF/jsp/systemSettings.jsp index 9ee7502b40..76227dafa0 100644 --- a/WebContent/WEB-INF/jsp/systemSettings.jsp +++ b/WebContent/WEB-INF/jsp/systemSettings.jsp @@ -575,7 +575,7 @@ const cssHighlighting = document.getElementById('cssHighlighting'); if (cssEditor && cssHighlighting) { cssEditor.addEventListener('input', () => { - updateCodeText(cssEditor.value, '#cssHighlightingContent'); + updateCodeTextEscaped(cssEditor.value, '#cssHighlightingContent'); }); cssEditor.addEventListener('scroll', () => { syncCodeScroll(cssEditor, '#cssHighlighting'); diff --git a/src/org/scada_lts/config/ScadaConfig.java b/src/org/scada_lts/config/ScadaConfig.java index 1f776d3c38..379154faa7 100644 --- a/src/org/scada_lts/config/ScadaConfig.java +++ b/src/org/scada_lts/config/ScadaConfig.java @@ -20,9 +20,6 @@ import com.serotonin.mango.Common; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.scada_lts.mango.service.SystemSettingsService; -import org.scada_lts.web.mvc.api.css.CssStyle; -import org.scada_lts.web.mvc.api.css.CssUtils; import java.io.File; import java.io.FileInputStream; @@ -326,11 +323,6 @@ public static boolean isExistCustomEnvProperties() { File f = new File(getPathCustomConfig()+FILE_NAME_PROPERTIES); return (f.exists()) && (!f.isDirectory()); } - - public static boolean isExistUserCSS() { - File f = new File(getPathCustomConfig()+FILE_NAME_USER_STYLESHEET); - return (f.exists()) && (!f.isDirectory()); - } public static void copyLogo() { try { @@ -355,12 +347,6 @@ public static void copyConfig() { LOG.error(e); } } - - public static void copyUserCSS() { - SystemSettingsService systemSettingsService = new SystemSettingsService(); - CssStyle cssContent = systemSettingsService.getCustomCss(); - CssUtils.saveToFile(cssContent); - } private ScadaConfig() { try { @@ -439,18 +425,5 @@ private static String getPathCustomConfig() { return path; } - - private static String getPathExistingUserCSS() { - String fileSeparator = System.getProperty("file.separator"); - String path = Common.ctx.getServletContext().getRealPath(""); - - if (fileSeparator.equals("\\")) { - path = path + "\\assets\\user_styles.css"; - } - if (fileSeparator.equals("/")) { - path = path + "/assets/user_styles.css"; - } - return path; - } } diff --git a/src/org/scada_lts/dao/SystemSettingsDAO.java b/src/org/scada_lts/dao/SystemSettingsDAO.java index 58f0d7ffa6..f469be10e4 100644 --- a/src/org/scada_lts/dao/SystemSettingsDAO.java +++ b/src/org/scada_lts/dao/SystemSettingsDAO.java @@ -28,7 +28,6 @@ import org.scada_lts.utils.ColorUtils; import org.scada_lts.utils.SystemSettingsUtils; import org.scada_lts.web.mvc.api.AggregateSettings; -import org.scada_lts.web.mvc.api.css.CssUtils; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; @@ -167,7 +166,7 @@ public class SystemSettingsDAO { public static final String EVENT_ASSIGN_ENABLED = "eventAssignEnabled"; public static final String TOP_DESCRIPTION_PREFIX = "topDescriptionPrefix"; public static final String TOP_DESCRIPTION = "topDescription"; - public static final String CUSTOM_CSS = "customCss"; + public static final String CUSTOM_CSS_CONTENT = "customCssContent"; // @formatter:off private static final String SELECT_SETTING_VALUE_WHERE = "" @@ -420,7 +419,7 @@ public String getDatabaseSchemaVersion(String key, String defaultValue) { DEFAULT_VALUES.put(EVENT_ASSIGN_ENABLED, SystemSettingsUtils.isEventAssignEnabled()); DEFAULT_VALUES.put(TOP_DESCRIPTION, ""); DEFAULT_VALUES.put(TOP_DESCRIPTION_PREFIX, ""); - DEFAULT_VALUES.put(CUSTOM_CSS, "" ); + DEFAULT_VALUES.put(CUSTOM_CSS_CONTENT, SystemSettingsUtils.getCustomCssContent()); } @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED, rollbackFor = SQLException.class) diff --git a/src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java b/src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java deleted file mode 100644 index 3a0ef90498..0000000000 --- a/src/org/scada_lts/dao/migration/mysql/V2_8_0_3_AddCustomCssColumnToSystemSettings.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.scada_lts.dao.migration.mysql; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.flywaydb.core.api.migration.BaseJavaMigration; -import org.flywaydb.core.api.migration.Context; -import org.scada_lts.dao.DAO; -import org.springframework.jdbc.core.JdbcTemplate; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; - -import static org.scada_lts.web.mvc.api.css.CssUtils.getCustomCssFileFromPath; - -public class V2_8_0_3_AddCustomCssColumnToSystemSettings extends BaseJavaMigration { - - private static final Log LOG = LogFactory.getLog(V2_8_0_3_AddCustomCssColumnToSystemSettings.class); - - @Override - public void migrate(Context context) throws Exception { - final JdbcTemplate jdbcTmp = DAO.getInstance().getJdbcTemp(); - - try { - updateCustomCssContent(jdbcTmp); - } catch (Exception ex) { - LOG.error(ex.getMessage(), ex); - throw ex; - } - } - - private void updateCustomCssContent(JdbcTemplate jdbcTmp) { - try { - File customCssFile = getCustomCssFileFromPath(); - if (customCssFile != null && customCssFile.exists()) { - String customCssContent = new String(Files.readAllBytes(customCssFile.toPath())); - jdbcTmp.update("UPDATE systemSettings SET customCss = ?", customCssContent); - } - } catch (IOException e) { - LOG.error("Error reading custom CSS file: " + e.getMessage(), e); - } - } -} diff --git a/src/org/scada_lts/mango/adapter/MangoScadaConfig.java b/src/org/scada_lts/mango/adapter/MangoScadaConfig.java index 9682cc3984..27f05773fd 100644 --- a/src/org/scada_lts/mango/adapter/MangoScadaConfig.java +++ b/src/org/scada_lts/mango/adapter/MangoScadaConfig.java @@ -21,6 +21,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.scada_lts.config.ScadaConfig; +import org.scada_lts.mango.service.SystemSettingsService; +import org.scada_lts.web.mvc.api.css.CssStyle; +import org.scada_lts.web.mvc.api.css.CustomCssUtils; /** @@ -56,10 +59,10 @@ public void init() { ScadaConfig.copyConfig(); } - if(ScadaConfig.isExistUserCSS()){ - LOG.info("copy user_styles"); - ScadaConfig.copyUserCSS(); - } + LOG.info("loading user_styles.css form database"); + SystemSettingsService service = new SystemSettingsService(); + CssStyle cssStyle = service.getCustomCss(); + CustomCssUtils.saveToFile(cssStyle); } diff --git a/src/org/scada_lts/mango/service/SystemSettingsService.java b/src/org/scada_lts/mango/service/SystemSettingsService.java index 92921b062c..049c75a970 100644 --- a/src/org/scada_lts/mango/service/SystemSettingsService.java +++ b/src/org/scada_lts/mango/service/SystemSettingsService.java @@ -522,10 +522,11 @@ private static Map deserializeMap(String json) { } public CssStyle getCustomCss() { - return new CssStyle(SystemSettingsDAO.getValue(SystemSettingsDAO.CUSTOM_CSS)); + String content = SystemSettingsDAO.getValue(SystemSettingsDAO.CUSTOM_CSS_CONTENT); + return new CssStyle(content); } - public void saveCustomCss(CssStyle cssStyle){ - systemSettingsDAO.setValue(SystemSettingsDAO.CUSTOM_CSS, cssStyle.getContent()); + public void saveCustomCss(CssStyle cssStyle) { + systemSettingsDAO.setValue(SystemSettingsDAO.CUSTOM_CSS_CONTENT, cssStyle.getContent()); } } diff --git a/src/org/scada_lts/utils/SystemSettingsUtils.java b/src/org/scada_lts/utils/SystemSettingsUtils.java index c0dab97fff..39c630d476 100644 --- a/src/org/scada_lts/utils/SystemSettingsUtils.java +++ b/src/org/scada_lts/utils/SystemSettingsUtils.java @@ -73,6 +73,8 @@ private SystemSettingsUtils() {} private static final String SECURITY_HTTP_QUERY_LIMIT_KEY = "scadalts.security.http.query.limit"; private static final String SECURITY_HTTP_QUERY_PROTECT_ENABLED_KEY = "scadalts.security.http.query.protect.enabled"; + private static final String CUSTOM_CSS_CONTENT_KEY = "systemsettings.custom.css.content"; + private static final org.apache.commons.logging.Log LOG = LogFactory.getLog(SystemSettingsUtils.class); public static DataPointSyncMode getDataPointSynchronizedMode() { @@ -594,4 +596,13 @@ public static boolean isSecurityHttpQueryProtectEnabled() { return false; } } + + public static String getCustomCssContent() { + try { + return ScadaConfig.getInstance().getConf().getProperty(CUSTOM_CSS_CONTENT_KEY, ""); + } catch (Exception e) { + LOG.error(e.getMessage()); + return ""; + } + } } diff --git a/src/org/scada_lts/web/mvc/api/CustomCssAPI.java b/src/org/scada_lts/web/mvc/api/CustomCssAPI.java index 4f925fdef2..9d9bc33cb7 100644 --- a/src/org/scada_lts/web/mvc/api/CustomCssAPI.java +++ b/src/org/scada_lts/web/mvc/api/CustomCssAPI.java @@ -12,14 +12,13 @@ import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; -import static org.scada_lts.web.mvc.api.css.CssUtils.saveToFile; +import static org.scada_lts.web.mvc.api.css.CustomCssUtils.saveToFile; @RestController @RequestMapping("/api/customcss") public class CustomCssAPI { private static final Log LOG = LogFactory.getLog(CustomCssAPI.class); - private static final String REQ_RESP_ERROR = "Couldn't create a *.css file."; private final SystemSettingsService systemSettingsService; @@ -27,22 +26,22 @@ public CustomCssAPI(SystemSettingsService systemSettingsService) { this.systemSettingsService = systemSettingsService; } - @GetMapping("") - public ResponseEntity getCustomCss(HttpServletRequest request) { + @GetMapping(value = "", produces = {"application/json;charset=UTF-8"}) + public ResponseEntity getCustomCss(HttpServletRequest request) { LOG.info("GET: /api/customcss"); try { CssStyle customCss = systemSettingsService.getCustomCss(); if (!StringUtils.isEmpty(customCss.getContent())) { - return new ResponseEntity<>(customCss, HttpStatus.OK); + return new ResponseEntity<>(customCss.clearedOfTabs(), HttpStatus.OK); } - return new ResponseEntity<>(REQ_RESP_ERROR,HttpStatus.BAD_REQUEST); + return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } catch (Exception e) { LOG.error(e); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } } - @PostMapping("") + @PostMapping(value = "", consumes = {"application/json;charset=UTF-8"}) public ResponseEntity saveCustomCss(HttpServletRequest request, @Valid @RequestBody(required = true) CssStyle cssStyle) { LOG.info("POST: /api/customcss"); try { diff --git a/src/org/scada_lts/web/mvc/api/css/CssStyle.java b/src/org/scada_lts/web/mvc/api/css/CssStyle.java index 48450487f4..44b964862b 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssStyle.java +++ b/src/org/scada_lts/web/mvc/api/css/CssStyle.java @@ -1,17 +1,24 @@ package org.scada_lts.web.mvc.api.css; -@CssValid + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + public class CssStyle { - private String content; - public CssStyle() { - } + @CssValid + private final String content; - public CssStyle(String content) { - this.content = content; + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) + public CssStyle(@JsonProperty("content") String content) { + this.content = CustomCssUtils.replaceToTab(content); } public String getContent() { return content; } + + public CssStyle clearedOfTabs() { + return new CssStyle(getContent().replace("\t", " ")); + } } diff --git a/src/org/scada_lts/web/mvc/api/css/CssValid.java b/src/org/scada_lts/web/mvc/api/css/CssValid.java index 29caf639c2..073f8f2978 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssValid.java +++ b/src/org/scada_lts/web/mvc/api/css/CssValid.java @@ -7,7 +7,7 @@ @Documented @Constraint(validatedBy = CssValidator.class) -@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER, ElementType.TYPE}) +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface CssValid { String message() default "Wrong Css format detected"; diff --git a/src/org/scada_lts/web/mvc/api/css/CssValidator.java b/src/org/scada_lts/web/mvc/api/css/CssValidator.java index 7df463a9e3..c076b7023f 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssValidator.java +++ b/src/org/scada_lts/web/mvc/api/css/CssValidator.java @@ -3,14 +3,14 @@ import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; -public class CssValidator implements ConstraintValidator { +public class CssValidator implements ConstraintValidator { @Override public void initialize(CssValid constraintAnnotation) { } @Override - public boolean isValid(CssStyle value, ConstraintValidatorContext context) { - return value != null && !value.getContent().trim().isEmpty(); + public boolean isValid(String value, ConstraintValidatorContext context) { + return value != null && !value.trim().isEmpty(); } } \ No newline at end of file diff --git a/src/org/scada_lts/web/mvc/api/css/CssUtils.java b/src/org/scada_lts/web/mvc/api/css/CustomCssUtils.java similarity index 58% rename from src/org/scada_lts/web/mvc/api/css/CssUtils.java rename to src/org/scada_lts/web/mvc/api/css/CustomCssUtils.java index e9a0478c2c..feb7c0d9c4 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssUtils.java +++ b/src/org/scada_lts/web/mvc/api/css/CustomCssUtils.java @@ -1,31 +1,29 @@ package org.scada_lts.web.mvc.api.css; -import com.serotonin.mango.Common; import com.serotonin.mango.util.LoggingUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.scada_lts.utils.PathSecureUtils; -import org.scada_lts.utils.UploadFileUtils; -import javax.servlet.ServletContext; -import javax.swing.text.html.CSS; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -public class CssUtils { +public class CustomCssUtils { - private static final Log LOG = LogFactory.getLog(CssUtils.class); + private static final Log LOG = LogFactory.getLog(CustomCssUtils.class); private static final String CSS_FILENAME = "/assets/user_styles.css"; + private static final String TAB = new String(new byte[]{-30, -128, -125}, StandardCharsets.UTF_8); public static boolean saveToFile(CssStyle cssStyle) { try { File customCssFile = getCustomCssFileFromPath(); if (customCssFile != null) { - try (BufferedWriter writer = new BufferedWriter(new FileWriter(customCssFile.getAbsolutePath()))) { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(customCssFile, StandardCharsets.UTF_8))) { writer.write(cssStyle.getContent()); } } @@ -36,11 +34,15 @@ public static boolean saveToFile(CssStyle cssStyle) { } } - public static File getCustomCssFileFromPath() { + private static File getCustomCssFileFromPath() { try { - Path fileName = PathSecureUtils.getAppContextSystemFilePath(CSS_FILENAME); - File cssFile = new File(fileName.toUri()); - if(!cssFile.exists()) { + Path path = PathSecureUtils.getAppContextSystemFilePath(CSS_FILENAME); + File cssFile = path.toFile(); + if(Files.exists(path) == Files.notExists(path)) { + LOG.warn("Missing file permissions!: " + CSS_FILENAME); + return null; + } + if(Files.notExists(path)) { boolean created = cssFile.createNewFile(); if(created) { LOG.info("Created custom CSS stylesheet file: " + CSS_FILENAME); @@ -48,8 +50,12 @@ public static File getCustomCssFileFromPath() { } return cssFile; } catch (IOException e) { - LOG.error("Could not create a custom CSS file: " + CSS_FILENAME); + LOG.warn("Could not create a custom CSS file: " + CSS_FILENAME); } return null; } + + public static String replaceToTab(String content) { + return content.replace(TAB, "\t"); + } } diff --git a/webapp-resources/env.properties b/webapp-resources/env.properties index 84ca3ac51b..00c3f7ed82 100644 --- a/webapp-resources/env.properties +++ b/webapp-resources/env.properties @@ -191,3 +191,5 @@ scadalts.security.http.query.protect.enabled=true scadalts.security.http.query.limit=3900 scadalts.security.http.query.access.denied.regex=^(.*?(script>|| Date: Tue, 17 Sep 2024 17:45:06 +0200 Subject: [PATCH 34/63] #2995 Added saving custom stylesheet to the database Added: - Validation for custom css - error handling for CustomCssAPI.java --- WebContent/WEB-INF/jsp/systemSettings.jsp | 20 ++++++ WebContent/WEB-INF/lib/cssparser-0.9.30.jar | Bin 0 -> 411469 bytes WebContent/WEB-INF/lib/sac-1.3.jar | Bin 0 -> 15808 bytes .../scada_lts/web/mvc/api/CustomCssAPI.java | 17 ++++- .../web/mvc/api/css/CssValidator.java | 62 +++++++++++++++++- 5 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 WebContent/WEB-INF/lib/cssparser-0.9.30.jar create mode 100644 WebContent/WEB-INF/lib/sac-1.3.jar diff --git a/WebContent/WEB-INF/jsp/systemSettings.jsp b/WebContent/WEB-INF/jsp/systemSettings.jsp index 76227dafa0..a1d24436b0 100644 --- a/WebContent/WEB-INF/jsp/systemSettings.jsp +++ b/WebContent/WEB-INF/jsp/systemSettings.jsp @@ -546,6 +546,10 @@ req.onload = () => { if (req.status === 200) { resolve(req.responseText); + } else if (req.status === 400) { + let errors = JSON.parse(req.responseText); + displayCssErrors(errors); + reject(errors); } else { reject(req.status); } @@ -562,6 +566,17 @@ }); } + function displayCssErrors(errors) { + let errorDiv = document.getElementById('cssErrors'); + errorDiv.innerHTML = ""; // Clear previous errors + + errors.forEach(error => { + let errorElement = document.createElement('p'); + errorElement.textContent = error; + errorDiv.appendChild(errorElement); + }); + } + function toUiPerformanceId() { var uiPerformance = $get("uiPerformanceId"); if(!uiPerformance) { @@ -1119,6 +1134,7 @@ +

    @@ -1206,6 +1222,10 @@ position: relative; height: 520px; } + .error-messages p { + color: red; + font-weight: bold; + } diff --git a/WebContent/WEB-INF/lib/cssparser-0.9.30.jar b/WebContent/WEB-INF/lib/cssparser-0.9.30.jar new file mode 100644 index 0000000000000000000000000000000000000000..1ee9271c84f5344a63f4ec35f5c2925f9a0de22e GIT binary patch literal 411469 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

    ;kF_ufU3-HHHsqxk$V4fR&VA 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

    2P9wZn-zpXJpV|awld|$*oITÐ4iJ+qB7GlWBYCU26^ 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 JSa|2Z{vSh!_W}R_ literal 0 HcmV?d00001 diff --git a/WebContent/WEB-INF/lib/sac-1.3.jar b/WebContent/WEB-INF/lib/sac-1.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..39b92b1d89c53bcaf82aeda2e4fe97ad534125f9 GIT binary patch literal 15808 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 getCustomCss(HttpServletRequest request) { } @PostMapping(value = "", consumes = {"application/json;charset=UTF-8"}) - public ResponseEntity saveCustomCss(HttpServletRequest request, @Valid @RequestBody(required = true) CssStyle cssStyle) { + public ResponseEntity saveCustomCss(HttpServletRequest request, @Valid @RequestBody(required = true) CssStyle cssStyle, BindingResult bindingResult) { LOG.info("POST: /api/customcss"); + if (bindingResult.hasErrors()) { + List errors = bindingResult.getFieldErrors().stream() + .map(error -> error.getDefaultMessage()) + .collect(Collectors.toList()); + + return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); + } + try { - if(!StringUtils.isEmpty(cssStyle.getContent())) { + if (!StringUtils.isEmpty(cssStyle.getContent())) { systemSettingsService.saveCustomCss(cssStyle); saveToFile(cssStyle); return new ResponseEntity<>(HttpStatus.OK); @@ -55,6 +67,5 @@ public ResponseEntity saveCustomCss(HttpServletRequest request, @Valid @Reque LOG.error(e); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } - } } diff --git a/src/org/scada_lts/web/mvc/api/css/CssValidator.java b/src/org/scada_lts/web/mvc/api/css/CssValidator.java index c076b7023f..e937fe213f 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssValidator.java +++ b/src/org/scada_lts/web/mvc/api/css/CssValidator.java @@ -1,7 +1,41 @@ package org.scada_lts.web.mvc.api.css; +import com.steadystate.css.parser.SACParserCSS3; +import org.w3c.css.sac.InputSource; +import org.w3c.css.sac.CSSParseException; +import org.w3c.css.sac.ErrorHandler; +import org.w3c.css.sac.Parser; + import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; +import java.io.StringReader; + +class CustomErrorHandler implements ErrorHandler { + private StringBuilder errorMessages = new StringBuilder(); + + @Override + public void warning(CSSParseException exception) { + errorMessages.append("Warning: ").append(exception.getMessage()).append("\n"); + } + + @Override + public void error(CSSParseException exception) { + errorMessages.append("Error: ").append(exception.getMessage()).append("\n"); + } + + @Override + public void fatalError(CSSParseException exception) { + errorMessages.append("Fatal Error: ").append(exception.getMessage()).append("\n"); + } + + public boolean hasErrors() { + return errorMessages.length() > 0; + } + + public String getErrorMessages() { + return errorMessages.toString(); + } +} public class CssValidator implements ConstraintValidator { @@ -11,6 +45,30 @@ public void initialize(CssValid constraintAnnotation) { @Override public boolean isValid(String value, ConstraintValidatorContext context) { - return value != null && !value.trim().isEmpty(); + if (value == null || value.trim().isEmpty()) { + return false; + } + + try { + Parser parser = new SACParserCSS3(); + InputSource inputSource = new InputSource(new StringReader(value)); + + CustomErrorHandler errorHandler = new CustomErrorHandler(); + parser.setErrorHandler(errorHandler); + + parser.parseStyleSheet(inputSource); + + if (errorHandler.hasErrors()) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(errorHandler.getErrorMessages()).addConstraintViolation(); + return false; + } + + return true; + } catch (Exception e) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate("Unexpected error: " + e.getMessage()).addConstraintViolation(); + return false; + } } -} \ No newline at end of file +} From 8bda4f5d0e0065f7b051602755611ef614f70471 Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 18 Sep 2024 09:49:30 +0200 Subject: [PATCH 35/63] #2995 Added saving custom stylesheet to the database: - Added classes: CssException, W3cCssValidator; - Added interface: CssValidator; - Refactoring CssConstraintValidator; --- .../scada_lts/web/mvc/api/css/CssStyle.java | 1 + .../web/mvc/api/css/CssValidator.java | 74 ------------------- .../validation/CssConstraintValidator.java | 39 ++++++++++ .../api/css/{ => validation}/CssValid.java | 4 +- .../css/validation/utils/CssException.java | 23 ++++++ .../css/validation/utils/CssValidator.java | 6 ++ .../css/validation/utils/W3cCssValidator.java | 53 +++++++++++++ 7 files changed, 124 insertions(+), 76 deletions(-) delete mode 100644 src/org/scada_lts/web/mvc/api/css/CssValidator.java create mode 100644 src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java rename src/org/scada_lts/web/mvc/api/css/{ => validation}/CssValid.java (80%) create mode 100644 src/org/scada_lts/web/mvc/api/css/validation/utils/CssException.java create mode 100644 src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java create mode 100644 src/org/scada_lts/web/mvc/api/css/validation/utils/W3cCssValidator.java diff --git a/src/org/scada_lts/web/mvc/api/css/CssStyle.java b/src/org/scada_lts/web/mvc/api/css/CssStyle.java index 44b964862b..a152ea0a39 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssStyle.java +++ b/src/org/scada_lts/web/mvc/api/css/CssStyle.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import org.scada_lts.web.mvc.api.css.validation.CssValid; public class CssStyle { diff --git a/src/org/scada_lts/web/mvc/api/css/CssValidator.java b/src/org/scada_lts/web/mvc/api/css/CssValidator.java deleted file mode 100644 index e937fe213f..0000000000 --- a/src/org/scada_lts/web/mvc/api/css/CssValidator.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.scada_lts.web.mvc.api.css; - -import com.steadystate.css.parser.SACParserCSS3; -import org.w3c.css.sac.InputSource; -import org.w3c.css.sac.CSSParseException; -import org.w3c.css.sac.ErrorHandler; -import org.w3c.css.sac.Parser; - -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; -import java.io.StringReader; - -class CustomErrorHandler implements ErrorHandler { - private StringBuilder errorMessages = new StringBuilder(); - - @Override - public void warning(CSSParseException exception) { - errorMessages.append("Warning: ").append(exception.getMessage()).append("\n"); - } - - @Override - public void error(CSSParseException exception) { - errorMessages.append("Error: ").append(exception.getMessage()).append("\n"); - } - - @Override - public void fatalError(CSSParseException exception) { - errorMessages.append("Fatal Error: ").append(exception.getMessage()).append("\n"); - } - - public boolean hasErrors() { - return errorMessages.length() > 0; - } - - public String getErrorMessages() { - return errorMessages.toString(); - } -} - -public class CssValidator implements ConstraintValidator { - - @Override - public void initialize(CssValid constraintAnnotation) { - } - - @Override - public boolean isValid(String value, ConstraintValidatorContext context) { - if (value == null || value.trim().isEmpty()) { - return false; - } - - try { - Parser parser = new SACParserCSS3(); - InputSource inputSource = new InputSource(new StringReader(value)); - - CustomErrorHandler errorHandler = new CustomErrorHandler(); - parser.setErrorHandler(errorHandler); - - parser.parseStyleSheet(inputSource); - - if (errorHandler.hasErrors()) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate(errorHandler.getErrorMessages()).addConstraintViolation(); - return false; - } - - return true; - } catch (Exception e) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate("Unexpected error: " + e.getMessage()).addConstraintViolation(); - return false; - } - } -} diff --git a/src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java b/src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java new file mode 100644 index 0000000000..fa6131ce69 --- /dev/null +++ b/src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java @@ -0,0 +1,39 @@ +package org.scada_lts.web.mvc.api.css.validation; + + +import com.serotonin.mango.util.LoggingUtils; +import org.scada_lts.serorepl.utils.StringUtils; +import org.scada_lts.web.mvc.api.css.validation.utils.CssValidator; +import org.scada_lts.web.mvc.api.css.validation.utils.W3cCssValidator; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + + +public class CssConstraintValidator implements ConstraintValidator { + + @Override + public void initialize(CssValid constraintAnnotation) { + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (StringUtils.isEmpty(value)) { + addErrors(context, "Empty"); + return false; + } + try { + CssValidator validator = new W3cCssValidator(); + validator.validate(value); + return true; + }catch (Exception e) { + addErrors(context, LoggingUtils.causeInfo(e)); + return false; + } + } + + private static void addErrors(ConstraintValidatorContext context, String msg) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate("Unexpected error: " + msg).addConstraintViolation(); + } +} diff --git a/src/org/scada_lts/web/mvc/api/css/CssValid.java b/src/org/scada_lts/web/mvc/api/css/validation/CssValid.java similarity index 80% rename from src/org/scada_lts/web/mvc/api/css/CssValid.java rename to src/org/scada_lts/web/mvc/api/css/validation/CssValid.java index 073f8f2978..f48f46fc1f 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssValid.java +++ b/src/org/scada_lts/web/mvc/api/css/validation/CssValid.java @@ -1,4 +1,4 @@ -package org.scada_lts.web.mvc.api.css; +package org.scada_lts.web.mvc.api.css.validation; import javax.validation.Constraint; @@ -6,7 +6,7 @@ import java.lang.annotation.*; @Documented -@Constraint(validatedBy = CssValidator.class) +@Constraint(validatedBy = CssConstraintValidator.class) @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface CssValid { diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/CssException.java b/src/org/scada_lts/web/mvc/api/css/validation/utils/CssException.java new file mode 100644 index 0000000000..3b744667e8 --- /dev/null +++ b/src/org/scada_lts/web/mvc/api/css/validation/utils/CssException.java @@ -0,0 +1,23 @@ +package org.scada_lts.web.mvc.api.css.validation.utils; + +public class CssException extends Exception { + + public CssException() { + } + + public CssException(String message) { + super(message); + } + + public CssException(String message, Throwable cause) { + super(message, cause); + } + + public CssException(Throwable cause) { + super(cause); + } + + public CssException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java b/src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java new file mode 100644 index 0000000000..ad8b6b21a8 --- /dev/null +++ b/src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java @@ -0,0 +1,6 @@ +package org.scada_lts.web.mvc.api.css.validation.utils; + +public interface CssValidator { + + void validate(String style) throws CssException; +} diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/W3cCssValidator.java b/src/org/scada_lts/web/mvc/api/css/validation/utils/W3cCssValidator.java new file mode 100644 index 0000000000..91d86c336f --- /dev/null +++ b/src/org/scada_lts/web/mvc/api/css/validation/utils/W3cCssValidator.java @@ -0,0 +1,53 @@ +package org.scada_lts.web.mvc.api.css.validation.utils; + +import com.steadystate.css.parser.SACParserCSS3; +import org.w3c.css.sac.*; + +import java.io.IOException; +import java.io.StringReader; + +public final class W3cCssValidator implements CssValidator { + + private final Parser parser; + + public W3cCssValidator() { + this.parser = createParser(); + } + + @Override + public void validate(String style) throws CssException { + try { + validateStyle(parser, style); + } catch (Exception e) { + throw new CssException(e.getMessage(), e); + } + } + + private static void validateStyle(Parser parser, String value) throws CSSParseException, IOException { + try(StringReader stringReader = new StringReader(value)) { + InputSource inputSource = new InputSource(stringReader); + parser.parseStyleSheet(inputSource); + } + } + + private static Parser createParser() { + Parser parser = new SACParserCSS3(); + parser.setErrorHandler(new ErrorHandler() { + @Override + public void warning(CSSParseException e) throws CSSException { + throw e; + } + + @Override + public void error(CSSParseException e) throws CSSException { + throw e; + } + + @Override + public void fatalError(CSSParseException e) throws CSSException { + throw e; + } + }); + return parser; + } +} From 3ef37d7d9138b0ebd2025093d3c8df458616a1db Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 18 Sep 2024 10:14:24 +0200 Subject: [PATCH 36/63] #2995 Added saving custom stylesheet to the database: - Fixed escape entered content editor; --- WebContent/WEB-INF/jsp/systemSettings.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebContent/WEB-INF/jsp/systemSettings.jsp b/WebContent/WEB-INF/jsp/systemSettings.jsp index a1d24436b0..cfb730d269 100644 --- a/WebContent/WEB-INF/jsp/systemSettings.jsp +++ b/WebContent/WEB-INF/jsp/systemSettings.jsp @@ -590,7 +590,7 @@ const cssHighlighting = document.getElementById('cssHighlighting'); if (cssEditor && cssHighlighting) { cssEditor.addEventListener('input', () => { - updateCodeTextEscaped(cssEditor.value, '#cssHighlightingContent'); + updateCodeText(cssEditor.value, '#cssHighlightingContent'); }); cssEditor.addEventListener('scroll', () => { syncCodeScroll(cssEditor, '#cssHighlighting'); From 51eb4bda68d1ead4c1ac350ed08e0f690a8fef62 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Wed, 18 Sep 2024 12:45:38 +0200 Subject: [PATCH 37/63] #2995 Added saving custom stylesheet to the database Changed error handling Added JUnit test class - CssValidatorTest.java --- WebContent/WEB-INF/jsp/systemSettings.jsp | 36 +++++-------- build.gradle | 1 + .../validation/utils/CssValidatorTest.java | 52 +++++++++++++++++++ webapp-resources/messages_de.properties | 4 +- webapp-resources/messages_en.properties | 4 +- webapp-resources/messages_es.properties | 4 +- webapp-resources/messages_fi.properties | 4 +- webapp-resources/messages_fr.properties | 4 +- webapp-resources/messages_lu.properties | 4 +- webapp-resources/messages_nl.properties | 4 +- webapp-resources/messages_pl.properties | 4 +- webapp-resources/messages_pt.properties | 4 +- webapp-resources/messages_ru.properties | 4 +- webapp-resources/messages_zh.properties | 4 +- 14 files changed, 98 insertions(+), 35 deletions(-) create mode 100644 test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java diff --git a/WebContent/WEB-INF/jsp/systemSettings.jsp b/WebContent/WEB-INF/jsp/systemSettings.jsp index cfb730d269..d4cbccf7e7 100644 --- a/WebContent/WEB-INF/jsp/systemSettings.jsp +++ b/WebContent/WEB-INF/jsp/systemSettings.jsp @@ -507,11 +507,6 @@ dialog.style.display = 'none'; } - function saveCssSettings() { - hideCssDialog(); - saveCustomCssConfig(); - } - function initCustomCssData() { fetchCustomCssConfig().then((val) => { let res = JSON.parse(val); @@ -543,12 +538,16 @@ let req = new XMLHttpRequest(); req.open('POST', customCssUrl, true); req.setRequestHeader('Content-Type', 'application/json;charset=UTF-8'); + setUserMessage("cssMessage"); req.onload = () => { if (req.status === 200) { resolve(req.responseText); + setUserMessage("cssMessage", ""); } else if (req.status === 400) { let errors = JSON.parse(req.responseText); - displayCssErrors(errors); + if(errors.length > 0) { + setUserMessage("cssMessage", ""); + } reject(errors); } else { reject(req.status); @@ -566,17 +565,6 @@ }); } - function displayCssErrors(errors) { - let errorDiv = document.getElementById('cssErrors'); - errorDiv.innerHTML = ""; // Clear previous errors - - errors.forEach(error => { - let errorElement = document.createElement('p'); - errorElement.textContent = error; - errorDiv.appendChild(errorElement); - }); - } - function toUiPerformanceId() { var uiPerformance = $get("uiPerformanceId"); if(!uiPerformance) { @@ -1134,7 +1122,6 @@ -

    @@ -1176,13 +1163,18 @@
    - + - +
    + + + + +

    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 VeAB`G_S7upThYGFqT?hW##(i^W{s>IZc3Gpar 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

  • @@ -1222,10 +1214,6 @@ position: relative; height: 520px; } - .error-messages p { - color: red; - font-weight: bold; - } diff --git a/build.gradle b/build.gradle index eb9a134bfb..74f86c32b6 100644 --- a/build.gradle +++ b/build.gradle @@ -240,6 +240,7 @@ test { includeTestsMatching "org.scada_lts.utils.BlockingQueuesUtilsTest" includeTestsMatching "org.scada_lts.web.security.XssProtectHtmlEscapeUtilsTest" includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" + includeTestsMatching "org.scada_lts.web.mvc.api.css.validation.utils.CssValidatorTest" } testLogging { diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java new file mode 100644 index 0000000000..b1e42d2f70 --- /dev/null +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java @@ -0,0 +1,52 @@ +package org.scada_lts.web.mvc.api.css.validation.utils; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +public class CssValidatorTest { + + @Parameterized.Parameters(name = "{index}: CSS: {0}, valid: {1}") + public static Collection data() { + return Arrays.asList(new Object[][]{ + // Valid CSS + {"body { color: red; }", true}, + {"h1 { font-size: 20px; }", true}, + {"#id { background-color: #fff; }", true}, + {"div { margin: 0 auto; padding: 10px; }", true}, + {".class { border: 1px solid black; }", true}, + {"p { line-height: 1.5; }", true}, + + // Invalid CSS + {"body { color: ; }", false}, + {"#id { background-color: #ggg; }", false}, + {"div { margin; }", false}, + {"@media screen and (max-width: 600px) { h1 { font-size: 30px }", false}, + {"body { color red; }", false}, + }); + } + + private final String css; + private final boolean isValid; + + public CssValidatorTest(String css, boolean isValid) { + this.css = css; + this.isValid = isValid; + } + + @Test + public void when_isValidCss() { + CssValidator validator = new W3cCssValidator(); + try { + validator.validate(css); + Assert.assertTrue(isValid); + } catch (CssException e) { + Assert.assertFalse(isValid); + } + } +} diff --git a/webapp-resources/messages_de.properties b/webapp-resources/messages_de.properties index 8a6fa0a49b..5c4845a688 100644 --- a/webapp-resources/messages_de.properties +++ b/webapp-resources/messages_de.properties @@ -3359,4 +3359,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee Column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file diff --git a/webapp-resources/messages_en.properties b/webapp-resources/messages_en.properties index 5d4bdf9842..b0754d6462 100644 --- a/webapp-resources/messages_en.properties +++ b/webapp-resources/messages_en.properties @@ -3362,4 +3362,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file diff --git a/webapp-resources/messages_es.properties b/webapp-resources/messages_es.properties index cc979ad4c8..2e8a914fee 100644 --- a/webapp-resources/messages_es.properties +++ b/webapp-resources/messages_es.properties @@ -3402,4 +3402,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file diff --git a/webapp-resources/messages_fi.properties b/webapp-resources/messages_fi.properties index aaa55078b1..cbec5ed19b 100644 --- a/webapp-resources/messages_fi.properties +++ b/webapp-resources/messages_fi.properties @@ -3487,4 +3487,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file diff --git a/webapp-resources/messages_fr.properties b/webapp-resources/messages_fr.properties index 6bec4083d1..04989450e7 100644 --- a/webapp-resources/messages_fr.properties +++ b/webapp-resources/messages_fr.properties @@ -3356,4 +3356,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file diff --git a/webapp-resources/messages_lu.properties b/webapp-resources/messages_lu.properties index 49fc70f8a9..c5de3c935b 100644 --- a/webapp-resources/messages_lu.properties +++ b/webapp-resources/messages_lu.properties @@ -3375,4 +3375,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file diff --git a/webapp-resources/messages_nl.properties b/webapp-resources/messages_nl.properties index 847e164111..12920c0e5b 100644 --- a/webapp-resources/messages_nl.properties +++ b/webapp-resources/messages_nl.properties @@ -3477,4 +3477,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file diff --git a/webapp-resources/messages_pl.properties b/webapp-resources/messages_pl.properties index c84a16787f..3dcfea4f78 100644 --- a/webapp-resources/messages_pl.properties +++ b/webapp-resources/messages_pl.properties @@ -3499,4 +3499,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file diff --git a/webapp-resources/messages_pt.properties b/webapp-resources/messages_pt.properties index 67caffd5a4..f1da72a2f1 100644 --- a/webapp-resources/messages_pt.properties +++ b/webapp-resources/messages_pt.properties @@ -3514,4 +3514,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file diff --git a/webapp-resources/messages_ru.properties b/webapp-resources/messages_ru.properties index b3687fdf0e..6d6599b241 100644 --- a/webapp-resources/messages_ru.properties +++ b/webapp-resources/messages_ru.properties @@ -3510,4 +3510,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file diff --git a/webapp-resources/messages_zh.properties b/webapp-resources/messages_zh.properties index 25314c370f..42d5424cbc 100644 --- a/webapp-resources/messages_zh.properties +++ b/webapp-resources/messages_zh.properties @@ -3462,4 +3462,6 @@ viewEdit.graphic.hideAssigneeColumn=Hide Assignee column systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets -header.dynamicImages=Dynamic images \ No newline at end of file +header.dynamicImages=Dynamic images +confirmation.customCss=Custom Css has been saved +systemSettings.invalidCss=Invalid css \ No newline at end of file From 195d38822c7e59a7aae7476ffe7b188f22824938 Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 18 Sep 2024 12:52:22 +0200 Subject: [PATCH 38/63] #2995 Added saving custom stylesheet to the database: - Change name form W3cCssValidator to SacCssValidator; --- .../web/mvc/api/css/validation/CssConstraintValidator.java | 4 ++-- .../utils/{W3cCssValidator.java => SacCssValidator.java} | 4 ++-- .../web/mvc/api/css/validation/utils/CssValidatorTest.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename src/org/scada_lts/web/mvc/api/css/validation/utils/{W3cCssValidator.java => SacCssValidator.java} (93%) diff --git a/src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java b/src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java index fa6131ce69..a57b3af538 100644 --- a/src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java +++ b/src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java @@ -4,7 +4,7 @@ import com.serotonin.mango.util.LoggingUtils; import org.scada_lts.serorepl.utils.StringUtils; import org.scada_lts.web.mvc.api.css.validation.utils.CssValidator; -import org.scada_lts.web.mvc.api.css.validation.utils.W3cCssValidator; +import org.scada_lts.web.mvc.api.css.validation.utils.SacCssValidator; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; @@ -23,7 +23,7 @@ public boolean isValid(String value, ConstraintValidatorContext context) { return false; } try { - CssValidator validator = new W3cCssValidator(); + CssValidator validator = new SacCssValidator(); validator.validate(value); return true; }catch (Exception e) { diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/W3cCssValidator.java b/src/org/scada_lts/web/mvc/api/css/validation/utils/SacCssValidator.java similarity index 93% rename from src/org/scada_lts/web/mvc/api/css/validation/utils/W3cCssValidator.java rename to src/org/scada_lts/web/mvc/api/css/validation/utils/SacCssValidator.java index 91d86c336f..08d45139b2 100644 --- a/src/org/scada_lts/web/mvc/api/css/validation/utils/W3cCssValidator.java +++ b/src/org/scada_lts/web/mvc/api/css/validation/utils/SacCssValidator.java @@ -6,11 +6,11 @@ import java.io.IOException; import java.io.StringReader; -public final class W3cCssValidator implements CssValidator { +public final class SacCssValidator implements CssValidator { private final Parser parser; - public W3cCssValidator() { + public SacCssValidator() { this.parser = createParser(); } diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java index b1e42d2f70..40ca97ee54 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java @@ -41,7 +41,7 @@ public CssValidatorTest(String css, boolean isValid) { @Test public void when_isValidCss() { - CssValidator validator = new W3cCssValidator(); + CssValidator validator = new SacCssValidator(); try { validator.validate(css); Assert.assertTrue(isValid); From 16a89a9a1235416a4f2a5c62c7f44e47011a7b89 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Wed, 18 Sep 2024 17:18:34 +0200 Subject: [PATCH 39/63] #2995 Added saving custom stylesheet to the database Minor frontend and test changes --- WebContent/WEB-INF/jsp/systemSettings.jsp | 4 +- build.gradle | 1 + .../utils/CssValidatorExceptionTest.java | 42 +++++++++++++++++++ .../validation/utils/CssValidatorTest.java | 30 +++++-------- webapp-resources/messages_de.properties | 4 +- webapp-resources/messages_en.properties | 4 +- webapp-resources/messages_es.properties | 4 +- webapp-resources/messages_fi.properties | 4 +- webapp-resources/messages_fr.properties | 4 +- webapp-resources/messages_lu.properties | 4 +- webapp-resources/messages_nl.properties | 4 +- webapp-resources/messages_pl.properties | 4 +- webapp-resources/messages_pt.properties | 4 +- webapp-resources/messages_ru.properties | 4 +- webapp-resources/messages_zh.properties | 4 +- 15 files changed, 77 insertions(+), 44 deletions(-) create mode 100644 test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java diff --git a/WebContent/WEB-INF/jsp/systemSettings.jsp b/WebContent/WEB-INF/jsp/systemSettings.jsp index d4cbccf7e7..02a9f6c701 100644 --- a/WebContent/WEB-INF/jsp/systemSettings.jsp +++ b/WebContent/WEB-INF/jsp/systemSettings.jsp @@ -542,11 +542,11 @@ req.onload = () => { if (req.status === 200) { resolve(req.responseText); - setUserMessage("cssMessage", ""); + setUserMessage("cssMessage", ""); } else if (req.status === 400) { let errors = JSON.parse(req.responseText); if(errors.length > 0) { - setUserMessage("cssMessage", ""); + setUserMessage("cssMessage", ""); } reject(errors); } else { diff --git a/build.gradle b/build.gradle index 74f86c32b6..3fc05794a7 100644 --- a/build.gradle +++ b/build.gradle @@ -241,6 +241,7 @@ test { includeTestsMatching "org.scada_lts.web.security.XssProtectHtmlEscapeUtilsTest" includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" includeTestsMatching "org.scada_lts.web.mvc.api.css.validation.utils.CssValidatorTest" + includeTestsMatching "org.scada_lts.web.mvc.api.css.validation.utils.CssValidatorExceptionTest" } testLogging { diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java new file mode 100644 index 0000000000..025c4ea446 --- /dev/null +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java @@ -0,0 +1,42 @@ +package org.scada_lts.web.mvc.api.css.validation.utils; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +public class CssValidatorExceptionTest { + + @Parameterized.Parameters(name = "{index}: CSS: {0}") + public static Collection data() { + return Arrays.asList(new Object[][]{ + {"body { color: ; }"}, + {"#id { background-color: #ggg; }"}, + {"div { margin; }"}, + {"@media screen and (max-width: 600px) { h1 { font-size: 30px }"}, + {"body { color red; }"}, + {"\">"}, + }); + } + + private final String css; + + public CssValidatorExceptionTest(String css) { + this.css = css; + } + + @Test + public void when_isInvalidCss() { + CssValidator validator = new W3cCssValidator(); + try { + validator.validate(css); + Assert.fail("Invalid CSS did not throw an exception"); + } catch (CssException e) { + Assert.assertTrue(true); + } + } +} diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java index b1e42d2f70..7ba03c6afa 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java @@ -11,32 +11,22 @@ @RunWith(Parameterized.class) public class CssValidatorTest { - @Parameterized.Parameters(name = "{index}: CSS: {0}, valid: {1}") + @Parameterized.Parameters(name = "{index}: CSS: {0}") public static Collection data() { return Arrays.asList(new Object[][]{ - // Valid CSS - {"body { color: red; }", true}, - {"h1 { font-size: 20px; }", true}, - {"#id { background-color: #fff; }", true}, - {"div { margin: 0 auto; padding: 10px; }", true}, - {".class { border: 1px solid black; }", true}, - {"p { line-height: 1.5; }", true}, - - // Invalid CSS - {"body { color: ; }", false}, - {"#id { background-color: #ggg; }", false}, - {"div { margin; }", false}, - {"@media screen and (max-width: 600px) { h1 { font-size: 30px }", false}, - {"body { color red; }", false}, + {"body { color: red; }"}, + {"h1 { font-size: 20px; }"}, + {"#id { background-color: #fff; }"}, + {"div { margin: 0 auto; padding: 10px; }"}, + {".class { border: 1px solid black; }"}, + {"p { line-height: 1.5; }"}, }); } private final String css; - private final boolean isValid; - public CssValidatorTest(String css, boolean isValid) { + public CssValidatorTest(String css) { this.css = css; - this.isValid = isValid; } @Test @@ -44,9 +34,9 @@ public void when_isValidCss() { CssValidator validator = new W3cCssValidator(); try { validator.validate(css); - Assert.assertTrue(isValid); + Assert.assertTrue(true); // Walidacja przeszła pomyślnie } catch (CssException e) { - Assert.assertFalse(isValid); + Assert.fail("Valid CSS threw an exception"); } } } diff --git a/webapp-resources/messages_de.properties b/webapp-resources/messages_de.properties index 5c4845a688..2ec02acefc 100644 --- a/webapp-resources/messages_de.properties +++ b/webapp-resources/messages_de.properties @@ -3360,5 +3360,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom Css has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file diff --git a/webapp-resources/messages_en.properties b/webapp-resources/messages_en.properties index b0754d6462..751a4d4e27 100644 --- a/webapp-resources/messages_en.properties +++ b/webapp-resources/messages_en.properties @@ -3363,5 +3363,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom Css has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file diff --git a/webapp-resources/messages_es.properties b/webapp-resources/messages_es.properties index 2e8a914fee..9395de9dbe 100644 --- a/webapp-resources/messages_es.properties +++ b/webapp-resources/messages_es.properties @@ -3403,5 +3403,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom Css has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file diff --git a/webapp-resources/messages_fi.properties b/webapp-resources/messages_fi.properties index cbec5ed19b..40edbe77ed 100644 --- a/webapp-resources/messages_fi.properties +++ b/webapp-resources/messages_fi.properties @@ -3488,5 +3488,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom Css has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file diff --git a/webapp-resources/messages_fr.properties b/webapp-resources/messages_fr.properties index 04989450e7..334dc7ce00 100644 --- a/webapp-resources/messages_fr.properties +++ b/webapp-resources/messages_fr.properties @@ -3357,5 +3357,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom Css has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file diff --git a/webapp-resources/messages_lu.properties b/webapp-resources/messages_lu.properties index c5de3c935b..28226095ef 100644 --- a/webapp-resources/messages_lu.properties +++ b/webapp-resources/messages_lu.properties @@ -3376,5 +3376,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom Css has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file diff --git a/webapp-resources/messages_nl.properties b/webapp-resources/messages_nl.properties index 12920c0e5b..b62697d7ca 100644 --- a/webapp-resources/messages_nl.properties +++ b/webapp-resources/messages_nl.properties @@ -3478,5 +3478,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom Css has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file diff --git a/webapp-resources/messages_pl.properties b/webapp-resources/messages_pl.properties index 3dcfea4f78..7d36957b80 100644 --- a/webapp-resources/messages_pl.properties +++ b/webapp-resources/messages_pl.properties @@ -3500,5 +3500,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom Css has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file diff --git a/webapp-resources/messages_pt.properties b/webapp-resources/messages_pt.properties index f1da72a2f1..ad015df123 100644 --- a/webapp-resources/messages_pt.properties +++ b/webapp-resources/messages_pt.properties @@ -3515,5 +3515,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom Css has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file diff --git a/webapp-resources/messages_ru.properties b/webapp-resources/messages_ru.properties index 6d6599b241..81a17cc15b 100644 --- a/webapp-resources/messages_ru.properties +++ b/webapp-resources/messages_ru.properties @@ -3511,5 +3511,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom Css has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file diff --git a/webapp-resources/messages_zh.properties b/webapp-resources/messages_zh.properties index 42d5424cbc..348932dc00 100644 --- a/webapp-resources/messages_zh.properties +++ b/webapp-resources/messages_zh.properties @@ -3463,5 +3463,5 @@ systemsettings.top.description.prefix = Top description prefix systemsettings.top.description = Top description header.imageSets=Image sets header.dynamicImages=Dynamic images -confirmation.customCss=Custom Css has been saved -systemSettings.invalidCss=Invalid css \ No newline at end of file +systemSettings.customCssSaved=Custom CSS has been saved +systemSettings.invalidCustomCss=Invalid custom CSS \ No newline at end of file From e51239099911f12fada1c8ac8c2f241627d42618 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Wed, 18 Sep 2024 17:20:16 +0200 Subject: [PATCH 40/63] #2995 Added saving custom stylesheet to the database Minor frontend and test changes --- .../mvc/api/css/validation/utils/CssValidatorExceptionTest.java | 2 +- .../web/mvc/api/css/validation/utils/CssValidatorTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java index 025c4ea446..0ecda2d04f 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java @@ -31,7 +31,7 @@ public CssValidatorExceptionTest(String css) { @Test public void when_isInvalidCss() { - CssValidator validator = new W3cCssValidator(); + CssValidator validator = new SacCssValidator(); try { validator.validate(css); Assert.fail("Invalid CSS did not throw an exception"); diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java index f9069f66bb..18b497d095 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java @@ -34,7 +34,7 @@ public void when_isValidCss() { CssValidator validator = new SacCssValidator(); try { validator.validate(css); - Assert.assertTrue(true); // Walidacja przeszła pomyślnie + Assert.assertTrue(true); } catch (CssException e) { Assert.fail("Valid CSS threw an exception"); } From eb1095f501e223ceaa195f7f5f8f5ef10dcaacb0 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Mon, 23 Sep 2024 15:25:49 +0200 Subject: [PATCH 41/63] #1580 Improvement describe information about scada on top --- ...TopDescriptionColumnsToSystemSettings.java | 45 ------------------- 1 file changed, 45 deletions(-) delete mode 100644 src/org/scada_lts/dao/migration/mysql/V2_8_0_2_AddTopDescriptionColumnsToSystemSettings.java diff --git a/src/org/scada_lts/dao/migration/mysql/V2_8_0_2_AddTopDescriptionColumnsToSystemSettings.java b/src/org/scada_lts/dao/migration/mysql/V2_8_0_2_AddTopDescriptionColumnsToSystemSettings.java deleted file mode 100644 index c291576954..0000000000 --- a/src/org/scada_lts/dao/migration/mysql/V2_8_0_2_AddTopDescriptionColumnsToSystemSettings.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.scada_lts.dao.migration.mysql; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.flywaydb.core.api.migration.BaseJavaMigration; -import org.flywaydb.core.api.migration.Context; -import org.scada_lts.dao.DAO; -import org.springframework.jdbc.core.JdbcTemplate; - -public class V2_8_0_2_AddTopDescriptionColumnsToSystemSettings extends BaseJavaMigration { - - private static final Log LOG = LogFactory.getLog(V2_8_0_2_AddTopDescriptionColumnsToSystemSettings.class); - - @Override - public void migrate(Context context) throws Exception { - final JdbcTemplate jdbcTmp = DAO.getInstance().getJdbcTemp(); - - try { - addTopDescriptionColumns(jdbcTmp); - } catch (Exception ex) { - LOG.error(ex.getMessage(), ex); - throw ex; - } - } - - private void addTopDescriptionColumns(JdbcTemplate jdbcTmp) { - boolean existsTopDescriptionColumn = jdbcTmp.queryForObject( - "SELECT (SELECT `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA`= DATABASE() AND `TABLE_NAME`='systemSettings' AND `COLUMN_NAME`='topDescription') IS NOT NULL;", - boolean.class - ); - - boolean existsTopDescriptionPrefixColumn = jdbcTmp.queryForObject( - "SELECT (SELECT `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA`= DATABASE() AND `TABLE_NAME`='systemSettings' AND `COLUMN_NAME`='topDescriptionPrefix') IS NOT NULL;", - boolean.class - ); - - if (!existsTopDescriptionColumn) { - jdbcTmp.update("ALTER TABLE systemSettings ADD COLUMN topDescription VARCHAR(255) DEFAULT '';"); - } - - if (!existsTopDescriptionPrefixColumn) { - jdbcTmp.update("ALTER TABLE systemSettings ADD COLUMN topDescriptionPrefix VARCHAR(255) DEFAULT '';"); - } - } -} From 7d9819d5872ff81321578c8a2a76095e04e457bb Mon Sep 17 00:00:00 2001 From: Kamil Date: Mon, 23 Sep 2024 15:30:25 +0200 Subject: [PATCH 42/63] #3017 errors in statistics: - fixed avg by sort values; - fixed start date; --- .../mango/rt/dataImage/DataPointRT.java | 20 --------------- .../view/chart/StatisticsChartRenderer.java | 10 +++----- .../mango/view/stats/AnalogStatistics.java | 25 ++++++++++++++++--- .../view/stats/StartsAndRuntimeList.java | 8 +++++- .../dao/pointvalues/PointValueDAO.java | 16 ++++++------ .../mango/service/PointValueService.java | 1 - 6 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/com/serotonin/mango/rt/dataImage/DataPointRT.java b/src/com/serotonin/mango/rt/dataImage/DataPointRT.java index cad74e9e10..d4e8caba95 100644 --- a/src/com/serotonin/mango/rt/dataImage/DataPointRT.java +++ b/src/com/serotonin/mango/rt/dataImage/DataPointRT.java @@ -129,32 +129,12 @@ public PointValueTime getPointValueAt(long time) { public List getPointValues(long since) { List result = pointValueService.getPointValues( vo.getId(), since); - - for (PointValueTime pvt : valueCache.getCacheContents()) { - if (pvt.getTime() >= since) { - int index = Collections.binarySearch(result, pvt, - pvtTimeComparator); - if (index < 0) - result.add(-index - 1, pvt); - } - } - return result; } public List getPointValuesBetween(long from, long to) { List result = pointValueService .getPointValuesBetween(vo.getId(), from, to); - - for (PointValueTime pvt : valueCache.getCacheContents()) { - if (pvt.getTime() >= from && pvt.getTime() < to) { - int index = Collections.binarySearch(result, pvt, - pvtTimeComparator); - if (index < 0) - result.add(-index - 1, pvt); - } - } - return result; } diff --git a/src/com/serotonin/mango/view/chart/StatisticsChartRenderer.java b/src/com/serotonin/mango/view/chart/StatisticsChartRenderer.java index 67748a6966..8327a0bcab 100644 --- a/src/com/serotonin/mango/view/chart/StatisticsChartRenderer.java +++ b/src/com/serotonin/mango/view/chart/StatisticsChartRenderer.java @@ -85,11 +85,9 @@ public void addDataToModel(Map model, DataPointVO point) { // The start value is the value of the point at the start of the period for this renderer. PointValueTime startValue = null; - if (values.size() == 0 || values.get(0).getTime() > startTime) { + if (!values.isEmpty()) { // Get the value of the point at the start time - PointValueTime valueTime = pointValueFacade.getPointValueBefore(startTime); - if (valueTime != null) - startValue = new PointValueTime(valueTime.getValue(), startTime); + startValue = values.get(0); } if (startValue != null || values.size() > 0) { @@ -97,13 +95,13 @@ public void addDataToModel(Map model, DataPointVO point) { // Runtime stats StartsAndRuntimeList stats = new StartsAndRuntimeList(startValue, values, startTime, startTime + getDuration()); - model.put("start", stats.getRealStart()); + model.put("start", stats.getStart()); model.put("end", stats.getEnd()); model.put("startsAndRuntimes", stats.getData()); } else if (dataTypeId == DataTypes.NUMERIC) { AnalogStatistics stats = new AnalogStatistics(startValue, values, startTime, startTime + getDuration()); - model.put("start", stats.getRealStart()); + model.put("start", stats.getStart()); model.put("end", stats.getEnd()); model.put("minimum", stats.getMinimum()); model.put("minTime", stats.getMinTime()); diff --git a/src/com/serotonin/mango/view/stats/AnalogStatistics.java b/src/com/serotonin/mango/view/stats/AnalogStatistics.java index 005f782265..bdb5e56595 100644 --- a/src/com/serotonin/mango/view/stats/AnalogStatistics.java +++ b/src/com/serotonin/mango/view/stats/AnalogStatistics.java @@ -38,6 +38,7 @@ public class AnalogStatistics implements StatisticsGenerator { private boolean noData = true; private long realStart; private final long end; + private final long start; // State values. private long lastTime = -1; @@ -56,6 +57,7 @@ public AnalogStatistics(Double startValue, List values, lo } public AnalogStatistics(Double startValue, long start, long end) { + this.start = start; this.end = end; if (startValue != null) { @@ -175,11 +177,28 @@ public String getHelp() { return toString(); } + public long getStart() { + return start; + } + @Override public String toString() { - return "{minimum: " + minimum + ", minTime=" + minTime + ", maximum: " + maximum + ", maxTime=" + maxTime - + ", average: " + average + ", sum: " + sum + ", count: " + count + ", noData: " + noData - + ", realStart: " + realStart + ", end: " + end + "}"; + return "AnalogStatistics{" + + "minimum=" + minimum + + ", minTime=" + minTime + + ", maximum=" + maximum + + ", maxTime=" + maxTime + + ", average=" + average + + ", sum=" + sum + + ", count=" + count + + ", noData=" + noData + + ", realStart=" + realStart + + ", start=" + start + + ", end=" + end + + ", lastTime=" + lastTime + + ", realDuration=" + realDuration + + ", lastValue=" + lastValue + + '}'; } public static void main(String[] args) { diff --git a/src/com/serotonin/mango/view/stats/StartsAndRuntimeList.java b/src/com/serotonin/mango/view/stats/StartsAndRuntimeList.java index bdc2acd0a7..5692b44b80 100644 --- a/src/com/serotonin/mango/view/stats/StartsAndRuntimeList.java +++ b/src/com/serotonin/mango/view/stats/StartsAndRuntimeList.java @@ -53,8 +53,10 @@ public StartsAndRuntimeList(MangoValue startValue, List va private long realStart = -1; private MangoValue lastValue; private StartsAndRuntime sar; + private final long start; public StartsAndRuntimeList(MangoValue startValue, long start, long end) { + this.start = start; this.end = end; if (startValue != null) { lastTime = start; @@ -70,7 +72,7 @@ public void addValueTime(IValueTime vt) { if (realStart == -1) realStart = lastTime; - if (!ObjectUtils.isEqual(vt.getValue(), lastValue)) { + if (!ObjectUtils.isEqual(vt.getValue().getObjectValue(), lastValue.getObjectValue())) { // Update the last value stats, if any. if (sar != null) sar.runtime += vt.getTime() - lastTime; @@ -142,6 +144,10 @@ public String getHelp() { return toString(); } + public long getStart() { + return start; + } + @Override public String toString() { return "{realStart: " + realStart + ", end: " + end + ", data: " + data.toString() + "}"; diff --git a/src/org/scada_lts/dao/pointvalues/PointValueDAO.java b/src/org/scada_lts/dao/pointvalues/PointValueDAO.java index 703eb09015..e82c8fdfc6 100644 --- a/src/org/scada_lts/dao/pointvalues/PointValueDAO.java +++ b/src/org/scada_lts/dao/pointvalues/PointValueDAO.java @@ -194,30 +194,30 @@ public class PointValueDAO implements GenericDaoCR, IPointValueDAO { public static final String POINT_VALUE_FILTER_BASE_ON_DATA_POINT_ID_AND_TIME_STAMP = " " + "pv."+COLUMN_NAME_DATA_POINT_ID+"=? and " - + "pv."+COLUMN_NAME_TIME_STAMP+" >= ? order by "+COLUMN_NAME_TIME_STAMP; + + "pv."+COLUMN_NAME_TIME_STAMP+" >= ? order by pv."+COLUMN_NAME_TIME_STAMP+", pv." + COLUMN_NAME_ID; public static final String POINT_VALUE_FILTER_BASE_ON_DATA_POINT_ID_AND_TIME_STAMP_FROM_TO = " " + "pv."+COLUMN_NAME_DATA_POINT_ID+"=? and " - + "pv."+COLUMN_NAME_TIME_STAMP+">=? and pv."+COLUMN_NAME_TIME_STAMP+"=? and pv."+COLUMN_NAME_TIME_STAMP+", IPointValueDAO { + "select id " + "from pointValues " + "where dataPointId =? " - + "order by id DESC " + + "order by ts DESC, id DESC " + "limit 2 " + ") lastId ) and " + COLUMN_NAME_TIME_STAMP + ", IPointValueDAO { "(select " + COLUMN_NAME_ID + " from pointValues " + "where " + COLUMN_NAME_DATA_POINT_ID + " =? " + - "order by " + COLUMN_NAME_ID + " desc " + + "order by " + COLUMN_NAME_TIME_STAMP + " desc, " + COLUMN_NAME_ID + " desc " + "limit 1 offset ?) lastId)"; private static final String SELECT_MAX_TIME_WHERE_DATA_POINT_ID = "" diff --git a/src/org/scada_lts/mango/service/PointValueService.java b/src/org/scada_lts/mango/service/PointValueService.java index ea9811c293..3286eea395 100644 --- a/src/org/scada_lts/mango/service/PointValueService.java +++ b/src/org/scada_lts/mango/service/PointValueService.java @@ -312,7 +312,6 @@ private long savePointValueImpl(int pointId, int dataType, double dvalue, long t //TODO rewrite private List getLstPointValueTime(List lstIn) { List lst = new ArrayList(); - lstIn.sort(Comparator.comparing(PointValue::getId).reversed()); for (PointValue pv : lstIn) { lst.add(pv.getPointValue()); } From 5181ec61d5d249e54366203327a07d1cfe9855bb Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Mon, 23 Sep 2024 16:47:12 +0200 Subject: [PATCH 43/63] #2995 Added saving custom stylesheet to the database --- build.gradle | 3 +-- .../utils/CssValidatorExceptionTest.java | 15 +++++---------- .../css/validation/utils/CssValidatorTest.java | 13 ++++--------- .../validation/utils/CssValidatorTestsSuite.java | 12 ++++++++++++ 4 files changed, 22 insertions(+), 21 deletions(-) create mode 100644 test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTestsSuite.java diff --git a/build.gradle b/build.gradle index 9b0247ebf7..2962dd4b1e 100644 --- a/build.gradle +++ b/build.gradle @@ -242,8 +242,7 @@ test { includeTestsMatching "org.scada_lts.utils.BlockingQueuesUtilsTest" includeTestsMatching "org.scada_lts.web.security.XssProtectHtmlEscapeUtilsTest" includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" - includeTestsMatching "org.scada_lts.web.mvc.api.css.validation.utils.CssValidatorTest" - includeTestsMatching "org.scada_lts.web.mvc.api.css.validation.utils.CssValidatorExceptionTest" + includeTestsMatching "org.scada_lts.web.mvc.api.css.validation.utils.CssValidatorTestsSuite" } failFast = true diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java index 0ecda2d04f..e58aa2688b 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java @@ -1,6 +1,5 @@ package org.scada_lts.web.mvc.api.css.validation.utils; -import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -24,19 +23,15 @@ public static Collection data() { } private final String css; + public final CssValidator validator; public CssValidatorExceptionTest(String css) { this.css = css; + this.validator = new SacCssValidator(); } - @Test - public void when_isInvalidCss() { - CssValidator validator = new SacCssValidator(); - try { - validator.validate(css); - Assert.fail("Invalid CSS did not throw an exception"); - } catch (CssException e) { - Assert.assertTrue(true); - } + @Test(expected = CssException.class) + public void when_isInvalidCss() throws CssException { + validator.validate(css); } } diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java index 18b497d095..8e5756128d 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java @@ -1,6 +1,5 @@ package org.scada_lts.web.mvc.api.css.validation.utils; -import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -24,19 +23,15 @@ public static Collection data() { } private final String css; + public final CssValidator validator; public CssValidatorTest(String css) { this.css = css; + this.validator = new SacCssValidator(); } @Test - public void when_isValidCss() { - CssValidator validator = new SacCssValidator(); - try { - validator.validate(css); - Assert.assertTrue(true); - } catch (CssException e) { - Assert.fail("Valid CSS threw an exception"); - } + public void when_isValidCss() throws CssException { + validator.validate(css); } } diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTestsSuite.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTestsSuite.java new file mode 100644 index 0000000000..affe36a966 --- /dev/null +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTestsSuite.java @@ -0,0 +1,12 @@ +package org.scada_lts.web.mvc.api.css.validation.utils; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + CssValidatorTest.class, + CssValidatorExceptionTest.class +}) +public class CssValidatorTestsSuite { +} From 973a2bdbeb6a0979fb34886a8b6b8d7f349e2637 Mon Sep 17 00:00:00 2001 From: Kamil Date: Mon, 23 Sep 2024 20:13:56 +0200 Subject: [PATCH 44/63] #3017 errors in statistics: - revert StartsAndRuntimeList; --- src/com/serotonin/mango/view/stats/StartsAndRuntimeList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/serotonin/mango/view/stats/StartsAndRuntimeList.java b/src/com/serotonin/mango/view/stats/StartsAndRuntimeList.java index 5692b44b80..fadad067d1 100644 --- a/src/com/serotonin/mango/view/stats/StartsAndRuntimeList.java +++ b/src/com/serotonin/mango/view/stats/StartsAndRuntimeList.java @@ -72,7 +72,7 @@ public void addValueTime(IValueTime vt) { if (realStart == -1) realStart = lastTime; - if (!ObjectUtils.isEqual(vt.getValue().getObjectValue(), lastValue.getObjectValue())) { + if (!ObjectUtils.isEqual(vt.getValue(), lastValue)) { // Update the last value stats, if any. if (sar != null) sar.runtime += vt.getTime() - lastTime; From dc6f5918fc81532cadcf99bbd109ba00a0f19474 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Tue, 24 Sep 2024 14:22:35 +0200 Subject: [PATCH 45/63] #2995 Added saving custom stylesheet to the database --- .../css/validation/utils/CssException.java | 23 ------------------- .../css/validation/utils/CssValidator.java | 2 +- .../validation/utils/CustomCssException.java | 23 +++++++++++++++++++ .../css/validation/utils/SacCssValidator.java | 6 ++--- .../utils/CssValidatorExceptionTest.java | 4 ++-- .../validation/utils/CssValidatorTest.java | 10 +++++++- 6 files changed, 38 insertions(+), 30 deletions(-) delete mode 100644 src/org/scada_lts/web/mvc/api/css/validation/utils/CssException.java create mode 100644 src/org/scada_lts/web/mvc/api/css/validation/utils/CustomCssException.java diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/CssException.java b/src/org/scada_lts/web/mvc/api/css/validation/utils/CssException.java deleted file mode 100644 index 3b744667e8..0000000000 --- a/src/org/scada_lts/web/mvc/api/css/validation/utils/CssException.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.scada_lts.web.mvc.api.css.validation.utils; - -public class CssException extends Exception { - - public CssException() { - } - - public CssException(String message) { - super(message); - } - - public CssException(String message, Throwable cause) { - super(message, cause); - } - - public CssException(Throwable cause) { - super(cause); - } - - public CssException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } -} diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java b/src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java index ad8b6b21a8..8ed98f7ab3 100644 --- a/src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java +++ b/src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java @@ -2,5 +2,5 @@ public interface CssValidator { - void validate(String style) throws CssException; + void validate(String style) throws CustomCssException; } diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/CustomCssException.java b/src/org/scada_lts/web/mvc/api/css/validation/utils/CustomCssException.java new file mode 100644 index 0000000000..c9561bc583 --- /dev/null +++ b/src/org/scada_lts/web/mvc/api/css/validation/utils/CustomCssException.java @@ -0,0 +1,23 @@ +package org.scada_lts.web.mvc.api.css.validation.utils; + +public class CustomCssException extends Exception { + + public CustomCssException() { + } + + public CustomCssException(String message) { + super(message); + } + + public CustomCssException(String message, Throwable cause) { + super(message, cause); + } + + public CustomCssException(Throwable cause) { + super(cause); + } + + public CustomCssException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/SacCssValidator.java b/src/org/scada_lts/web/mvc/api/css/validation/utils/SacCssValidator.java index 08d45139b2..ebefad4d16 100644 --- a/src/org/scada_lts/web/mvc/api/css/validation/utils/SacCssValidator.java +++ b/src/org/scada_lts/web/mvc/api/css/validation/utils/SacCssValidator.java @@ -15,16 +15,16 @@ public SacCssValidator() { } @Override - public void validate(String style) throws CssException { + public void validate(String style) throws CustomCssException { try { validateStyle(parser, style); } catch (Exception e) { - throw new CssException(e.getMessage(), e); + throw new CustomCssException(e.getMessage(), e); } } private static void validateStyle(Parser parser, String value) throws CSSParseException, IOException { - try(StringReader stringReader = new StringReader(value)) { + try (StringReader stringReader = new StringReader(value)) { InputSource inputSource = new InputSource(stringReader); parser.parseStyleSheet(inputSource); } diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java index e58aa2688b..c15f26dab8 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java @@ -30,8 +30,8 @@ public CssValidatorExceptionTest(String css) { this.validator = new SacCssValidator(); } - @Test(expected = CssException.class) - public void when_isInvalidCss() throws CssException { + @Test(expected = CustomCssException.class) + public void when_isInvalidCss() throws CustomCssException { validator.validate(css); } } diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java index 8e5756128d..b5624319d2 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java @@ -19,6 +19,14 @@ public static Collection data() { {"div { margin: 0 auto; padding: 10px; }"}, {".class { border: 1px solid black; }"}, {"p { line-height: 1.5; }"}, + {"body { background-image: url('\">'); }"}, + {"div { content: \"\"; }"}, + {"h1 { font-family: \"\"; }"}, + {"p { margin: 10px; background-color: red; }"}, + {"@import url(\"javascript:alert('XSS')\");"}, + {"div { /* comment: */ }"}, + {"span { content: '\">'; }"}, + {"h2 { color: expression(alert('XSS')); }"} }); } @@ -31,7 +39,7 @@ public CssValidatorTest(String css) { } @Test - public void when_isValidCss() throws CssException { + public void when_isValidCss() throws CustomCssException { validator.validate(css); } } From ed464ad0d0ea9fc3863bff1db5d56f3565ebd640 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Wed, 25 Sep 2024 10:12:55 +0200 Subject: [PATCH 46/63] #2995 Added saving custom stylesheet to the database - Minor changes --- WebContent/WEB-INF/jsp/systemSettings.jsp | 8 ++++---- .../mvc/api/css/validation/utils/CssValidatorTest.java | 8 -------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/WebContent/WEB-INF/jsp/systemSettings.jsp b/WebContent/WEB-INF/jsp/systemSettings.jsp index fc81841a98..6c0b7b32fc 100644 --- a/WebContent/WEB-INF/jsp/systemSettings.jsp +++ b/WebContent/WEB-INF/jsp/systemSettings.jsp @@ -538,15 +538,15 @@ let req = new XMLHttpRequest(); req.open('POST', customCssUrl, true); req.setRequestHeader('Content-Type', 'application/json;charset=UTF-8'); - setUserMessage("cssMessage"); + setUserMessage("CustomCssMessage"); req.onload = () => { if (req.status === 200) { resolve(req.responseText); - setUserMessage("cssMessage", ""); + setUserMessage("CustomCssMessage", ""); } else if (req.status === 400) { let errors = JSON.parse(req.responseText); if(errors.length > 0) { - setUserMessage("cssMessage", ""); + setUserMessage("CustomCssMessage", ""); } reject(errors); } else { @@ -1172,7 +1172,7 @@ - +
    diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java index b5624319d2..d3658ed1ec 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java +++ b/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java @@ -19,14 +19,6 @@ public static Collection data() { {"div { margin: 0 auto; padding: 10px; }"}, {".class { border: 1px solid black; }"}, {"p { line-height: 1.5; }"}, - {"body { background-image: url('\">'); }"}, - {"div { content: \"\"; }"}, - {"h1 { font-family: \"\"; }"}, - {"p { margin: 10px; background-color: red; }"}, - {"@import url(\"javascript:alert('XSS')\");"}, - {"div { /* comment: */ }"}, - {"span { content: '\">'; }"}, - {"h2 { color: expression(alert('XSS')); }"} }); } From 9a4b858ada34012061b5180eed6678cd6e7c7474 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Wed, 25 Sep 2024 10:53:41 +0200 Subject: [PATCH 47/63] #2995 Added saving custom stylesheet to the database --- WebContent/WEB-INF/jsp/systemSettings.jsp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/WebContent/WEB-INF/jsp/systemSettings.jsp b/WebContent/WEB-INF/jsp/systemSettings.jsp index 6c0b7b32fc..c8e12ff945 100644 --- a/WebContent/WEB-INF/jsp/systemSettings.jsp +++ b/WebContent/WEB-INF/jsp/systemSettings.jsp @@ -538,15 +538,15 @@ let req = new XMLHttpRequest(); req.open('POST', customCssUrl, true); req.setRequestHeader('Content-Type', 'application/json;charset=UTF-8'); - setUserMessage("CustomCssMessage"); + setUserMessage("customCssMessage"); req.onload = () => { if (req.status === 200) { resolve(req.responseText); - setUserMessage("CustomCssMessage", ""); + setUserMessage("customCssMessage", ""); } else if (req.status === 400) { let errors = JSON.parse(req.responseText); if(errors.length > 0) { - setUserMessage("CustomCssMessage", ""); + setUserMessage("customCssMessage", ""); } reject(errors); } else { @@ -1172,7 +1172,7 @@ - +
    From 693f0244f9c3658b17b6352555408421954fbd4c Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 25 Sep 2024 14:06:08 +0200 Subject: [PATCH 48/63] #3021 Refactoring for String validation by Java Bean Validation: - created interface ScadaValidator and exception ScadaValidatorException, AbstractConstraintValidator, CssValidatorException; - moved css validation to org.scada_lts.web.beans.validation.css; --- build.gradle | 2 +- .../AbstractConstraintValidator.java | 47 +++++++++++++++++++ .../web/beans/validation/ScadaValidator.java | 7 +++ .../validation/ScadaValidatorException.java | 23 +++++++++ .../css/CssConstraintValidator.java | 26 ++++++++++ .../validation/css}/CssValid.java | 2 +- .../validation/css/CssValidatorException.java | 25 ++++++++++ .../validation/css}/SacCssValidator.java | 9 ++-- .../scada_lts/web/mvc/api/css/CssStyle.java | 2 +- .../validation/CssConstraintValidator.java | 39 --------------- .../css/validation/utils/CssValidator.java | 6 --- .../validation/utils/CustomCssException.java | 23 --------- .../css}/CssValidatorExceptionTest.java | 10 ++-- .../validation/css}/CssValidatorTest.java | 8 ++-- .../css}/CssValidatorTestsSuite.java | 2 +- webapp-resources/log4j2.xml | 7 +++ 16 files changed, 155 insertions(+), 83 deletions(-) create mode 100644 src/org/scada_lts/web/beans/validation/AbstractConstraintValidator.java create mode 100644 src/org/scada_lts/web/beans/validation/ScadaValidator.java create mode 100644 src/org/scada_lts/web/beans/validation/ScadaValidatorException.java create mode 100644 src/org/scada_lts/web/beans/validation/css/CssConstraintValidator.java rename src/org/scada_lts/web/{mvc/api/css/validation => beans/validation/css}/CssValid.java (90%) create mode 100644 src/org/scada_lts/web/beans/validation/css/CssValidatorException.java rename src/org/scada_lts/web/{mvc/api/css/validation/utils => beans/validation/css}/SacCssValidator.java (80%) delete mode 100644 src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java delete mode 100644 src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java delete mode 100644 src/org/scada_lts/web/mvc/api/css/validation/utils/CustomCssException.java rename test/org/scada_lts/web/{mvc/api/css/validation/utils => beans/validation/css}/CssValidatorExceptionTest.java (72%) rename test/org/scada_lts/web/{mvc/api/css/validation/utils => beans/validation/css}/CssValidatorTest.java (75%) rename test/org/scada_lts/web/{mvc/api/css/validation/utils => beans/validation/css}/CssValidatorTestsSuite.java (80%) diff --git a/build.gradle b/build.gradle index 2962dd4b1e..352a67a2af 100644 --- a/build.gradle +++ b/build.gradle @@ -242,7 +242,7 @@ test { includeTestsMatching "org.scada_lts.utils.BlockingQueuesUtilsTest" includeTestsMatching "org.scada_lts.web.security.XssProtectHtmlEscapeUtilsTest" includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" - includeTestsMatching "org.scada_lts.web.mvc.api.css.validation.utils.CssValidatorTestsSuite" + includeTestsMatching "org.scada_lts.web.mvc.api.validation.css.CssValidatorTestsSuite" } failFast = true diff --git a/src/org/scada_lts/web/beans/validation/AbstractConstraintValidator.java b/src/org/scada_lts/web/beans/validation/AbstractConstraintValidator.java new file mode 100644 index 0000000000..798349cd0f --- /dev/null +++ b/src/org/scada_lts/web/beans/validation/AbstractConstraintValidator.java @@ -0,0 +1,47 @@ +package org.scada_lts.web.beans.validation; + + +import com.serotonin.mango.util.LoggingUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.lang.annotation.Annotation; + + +public abstract class AbstractConstraintValidator
    implements ConstraintValidator { + + private static final Logger LOG = LogManager.getLogger(AbstractConstraintValidator.class); + + @Override + public void initialize(A constraintAnnotation) { + } + + @Override + public final boolean isValid(T value, ConstraintValidatorContext context) { + try { + beforeValidate(value); + } catch (Exception e) { + LOG.warn("ConstraintValidator: {}", LoggingUtils.causeInfo(e)); + addErrors(context, LoggingUtils.causeInfo(e)); + return false; + } + try { + validate(value); + return true; + } catch (Exception e) { + LOG.warn("ConstraintValidator: {}", LoggingUtils.causeInfo(e)); + addErrors(context, LoggingUtils.causeInfo(e)); + return false; + } + } + + public void beforeValidate(T value) throws Exception {} + public abstract void validate(T value) throws Exception; + + private static void addErrors(ConstraintValidatorContext context, String msg) { + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate("Unexpected error: " + msg).addConstraintViolation(); + } +} diff --git a/src/org/scada_lts/web/beans/validation/ScadaValidator.java b/src/org/scada_lts/web/beans/validation/ScadaValidator.java new file mode 100644 index 0000000000..d9e40966d7 --- /dev/null +++ b/src/org/scada_lts/web/beans/validation/ScadaValidator.java @@ -0,0 +1,7 @@ +package org.scada_lts.web.beans.validation; + +public interface ScadaValidator { + + void validate(T object) throws ScadaValidatorException; + +} diff --git a/src/org/scada_lts/web/beans/validation/ScadaValidatorException.java b/src/org/scada_lts/web/beans/validation/ScadaValidatorException.java new file mode 100644 index 0000000000..0e7fde1f66 --- /dev/null +++ b/src/org/scada_lts/web/beans/validation/ScadaValidatorException.java @@ -0,0 +1,23 @@ +package org.scada_lts.web.beans.validation; + +public class ScadaValidatorException extends Exception { + + public ScadaValidatorException() { + } + + public ScadaValidatorException(String message) { + super(message); + } + + public ScadaValidatorException(String message, Throwable cause) { + super(message, cause); + } + + public ScadaValidatorException(Throwable cause) { + super(cause); + } + + public ScadaValidatorException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/org/scada_lts/web/beans/validation/css/CssConstraintValidator.java b/src/org/scada_lts/web/beans/validation/css/CssConstraintValidator.java new file mode 100644 index 0000000000..69911930ee --- /dev/null +++ b/src/org/scada_lts/web/beans/validation/css/CssConstraintValidator.java @@ -0,0 +1,26 @@ +package org.scada_lts.web.beans.validation.css; + +import org.scada_lts.serorepl.utils.StringUtils; +import org.scada_lts.web.beans.validation.AbstractConstraintValidator; +import org.scada_lts.web.beans.validation.ScadaValidator; + + +public class CssConstraintValidator extends AbstractConstraintValidator { + + @Override + public void initialize(CssValid constraintAnnotation) { + } + + @Override + public void beforeValidate(String value) throws Exception { + if(StringUtils.isEmpty(value)) { + throw new CssValidatorException("Empty"); + } + } + + @Override + public void validate(String value) throws Exception { + ScadaValidator validator = new SacCssValidator(); + validator.validate(value); + } +} diff --git a/src/org/scada_lts/web/mvc/api/css/validation/CssValid.java b/src/org/scada_lts/web/beans/validation/css/CssValid.java similarity index 90% rename from src/org/scada_lts/web/mvc/api/css/validation/CssValid.java rename to src/org/scada_lts/web/beans/validation/css/CssValid.java index f48f46fc1f..5abb9bd8a9 100644 --- a/src/org/scada_lts/web/mvc/api/css/validation/CssValid.java +++ b/src/org/scada_lts/web/beans/validation/css/CssValid.java @@ -1,4 +1,4 @@ -package org.scada_lts.web.mvc.api.css.validation; +package org.scada_lts.web.beans.validation.css; import javax.validation.Constraint; diff --git a/src/org/scada_lts/web/beans/validation/css/CssValidatorException.java b/src/org/scada_lts/web/beans/validation/css/CssValidatorException.java new file mode 100644 index 0000000000..f1d8943a93 --- /dev/null +++ b/src/org/scada_lts/web/beans/validation/css/CssValidatorException.java @@ -0,0 +1,25 @@ +package org.scada_lts.web.beans.validation.css; + +import org.scada_lts.web.beans.validation.ScadaValidatorException; + +public class CssValidatorException extends ScadaValidatorException { + + public CssValidatorException() { + } + + public CssValidatorException(String message) { + super(message); + } + + public CssValidatorException(String message, Throwable cause) { + super(message, cause); + } + + public CssValidatorException(Throwable cause) { + super(cause); + } + + public CssValidatorException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/SacCssValidator.java b/src/org/scada_lts/web/beans/validation/css/SacCssValidator.java similarity index 80% rename from src/org/scada_lts/web/mvc/api/css/validation/utils/SacCssValidator.java rename to src/org/scada_lts/web/beans/validation/css/SacCssValidator.java index ebefad4d16..f7c31f79d1 100644 --- a/src/org/scada_lts/web/mvc/api/css/validation/utils/SacCssValidator.java +++ b/src/org/scada_lts/web/beans/validation/css/SacCssValidator.java @@ -1,12 +1,13 @@ -package org.scada_lts.web.mvc.api.css.validation.utils; +package org.scada_lts.web.beans.validation.css; import com.steadystate.css.parser.SACParserCSS3; +import org.scada_lts.web.beans.validation.ScadaValidator; import org.w3c.css.sac.*; import java.io.IOException; import java.io.StringReader; -public final class SacCssValidator implements CssValidator { +public final class SacCssValidator implements ScadaValidator { private final Parser parser; @@ -15,11 +16,11 @@ public SacCssValidator() { } @Override - public void validate(String style) throws CustomCssException { + public void validate(String style) throws CssValidatorException { try { validateStyle(parser, style); } catch (Exception e) { - throw new CustomCssException(e.getMessage(), e); + throw new CssValidatorException(e.getMessage(), e); } } diff --git a/src/org/scada_lts/web/mvc/api/css/CssStyle.java b/src/org/scada_lts/web/mvc/api/css/CssStyle.java index a152ea0a39..0021b3f7f4 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssStyle.java +++ b/src/org/scada_lts/web/mvc/api/css/CssStyle.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import org.scada_lts.web.mvc.api.css.validation.CssValid; +import org.scada_lts.web.beans.validation.css.CssValid; public class CssStyle { diff --git a/src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java b/src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java deleted file mode 100644 index a57b3af538..0000000000 --- a/src/org/scada_lts/web/mvc/api/css/validation/CssConstraintValidator.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.scada_lts.web.mvc.api.css.validation; - - -import com.serotonin.mango.util.LoggingUtils; -import org.scada_lts.serorepl.utils.StringUtils; -import org.scada_lts.web.mvc.api.css.validation.utils.CssValidator; -import org.scada_lts.web.mvc.api.css.validation.utils.SacCssValidator; - -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; - - -public class CssConstraintValidator implements ConstraintValidator { - - @Override - public void initialize(CssValid constraintAnnotation) { - } - - @Override - public boolean isValid(String value, ConstraintValidatorContext context) { - if (StringUtils.isEmpty(value)) { - addErrors(context, "Empty"); - return false; - } - try { - CssValidator validator = new SacCssValidator(); - validator.validate(value); - return true; - }catch (Exception e) { - addErrors(context, LoggingUtils.causeInfo(e)); - return false; - } - } - - private static void addErrors(ConstraintValidatorContext context, String msg) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate("Unexpected error: " + msg).addConstraintViolation(); - } -} diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java b/src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java deleted file mode 100644 index 8ed98f7ab3..0000000000 --- a/src/org/scada_lts/web/mvc/api/css/validation/utils/CssValidator.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.scada_lts.web.mvc.api.css.validation.utils; - -public interface CssValidator { - - void validate(String style) throws CustomCssException; -} diff --git a/src/org/scada_lts/web/mvc/api/css/validation/utils/CustomCssException.java b/src/org/scada_lts/web/mvc/api/css/validation/utils/CustomCssException.java deleted file mode 100644 index c9561bc583..0000000000 --- a/src/org/scada_lts/web/mvc/api/css/validation/utils/CustomCssException.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.scada_lts.web.mvc.api.css.validation.utils; - -public class CustomCssException extends Exception { - - public CustomCssException() { - } - - public CustomCssException(String message) { - super(message); - } - - public CustomCssException(String message, Throwable cause) { - super(message, cause); - } - - public CustomCssException(Throwable cause) { - super(cause); - } - - public CustomCssException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { - super(message, cause, enableSuppression, writableStackTrace); - } -} diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java b/test/org/scada_lts/web/beans/validation/css/CssValidatorExceptionTest.java similarity index 72% rename from test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java rename to test/org/scada_lts/web/beans/validation/css/CssValidatorExceptionTest.java index c15f26dab8..4d521bf59c 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorExceptionTest.java +++ b/test/org/scada_lts/web/beans/validation/css/CssValidatorExceptionTest.java @@ -1,8 +1,10 @@ -package org.scada_lts.web.mvc.api.css.validation.utils; +package org.scada_lts.web.beans.validation.css; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.scada_lts.web.beans.validation.ScadaValidator; +import org.scada_lts.web.beans.validation.ScadaValidatorException; import java.util.Arrays; import java.util.Collection; @@ -23,15 +25,15 @@ public static Collection data() { } private final String css; - public final CssValidator validator; + public final ScadaValidator validator; public CssValidatorExceptionTest(String css) { this.css = css; this.validator = new SacCssValidator(); } - @Test(expected = CustomCssException.class) - public void when_isInvalidCss() throws CustomCssException { + @Test(expected = CssValidatorException.class) + public void when_isInvalidCss() throws ScadaValidatorException { validator.validate(css); } } diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java b/test/org/scada_lts/web/beans/validation/css/CssValidatorTest.java similarity index 75% rename from test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java rename to test/org/scada_lts/web/beans/validation/css/CssValidatorTest.java index d3658ed1ec..ff5f6efbc6 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTest.java +++ b/test/org/scada_lts/web/beans/validation/css/CssValidatorTest.java @@ -1,8 +1,10 @@ -package org.scada_lts.web.mvc.api.css.validation.utils; +package org.scada_lts.web.beans.validation.css; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.scada_lts.web.beans.validation.ScadaValidator; +import org.scada_lts.web.beans.validation.ScadaValidatorException; import java.util.Arrays; import java.util.Collection; @@ -23,7 +25,7 @@ public static Collection data() { } private final String css; - public final CssValidator validator; + public final ScadaValidator validator; public CssValidatorTest(String css) { this.css = css; @@ -31,7 +33,7 @@ public CssValidatorTest(String css) { } @Test - public void when_isValidCss() throws CustomCssException { + public void when_isValidCss() throws ScadaValidatorException { validator.validate(css); } } diff --git a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTestsSuite.java b/test/org/scada_lts/web/beans/validation/css/CssValidatorTestsSuite.java similarity index 80% rename from test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTestsSuite.java rename to test/org/scada_lts/web/beans/validation/css/CssValidatorTestsSuite.java index affe36a966..327e00eda8 100644 --- a/test/org/scada_lts/web/mvc/api/css/validation/utils/CssValidatorTestsSuite.java +++ b/test/org/scada_lts/web/beans/validation/css/CssValidatorTestsSuite.java @@ -1,4 +1,4 @@ -package org.scada_lts.web.mvc.api.css.validation.utils; +package org.scada_lts.web.beans.validation.css; import org.junit.runner.RunWith; import org.junit.runners.Suite; diff --git a/webapp-resources/log4j2.xml b/webapp-resources/log4j2.xml index 8f07ef9f6d..56c759e1b0 100644 --- a/webapp-resources/log4j2.xml +++ b/webapp-resources/log4j2.xml @@ -45,6 +45,9 @@ ERROR + + WARN + @@ -327,6 +330,10 @@ + + + + From 3e677d9d70e879312dc98fef54213ccce594c58f Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 25 Sep 2024 14:12:47 +0200 Subject: [PATCH 49/63] #3021 Refactoring for String validation by Java Bean Validation: - CssConstraintValidator: removed initialize method; --- .../web/beans/validation/css/CssConstraintValidator.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/org/scada_lts/web/beans/validation/css/CssConstraintValidator.java b/src/org/scada_lts/web/beans/validation/css/CssConstraintValidator.java index 69911930ee..eed5566eab 100644 --- a/src/org/scada_lts/web/beans/validation/css/CssConstraintValidator.java +++ b/src/org/scada_lts/web/beans/validation/css/CssConstraintValidator.java @@ -7,10 +7,6 @@ public class CssConstraintValidator extends AbstractConstraintValidator { - @Override - public void initialize(CssValid constraintAnnotation) { - } - @Override public void beforeValidate(String value) throws Exception { if(StringUtils.isEmpty(value)) { From f62a4edf4e5cffc34723b58341504be1f3795ec4 Mon Sep 17 00:00:00 2001 From: Kamil Date: Wed, 25 Sep 2024 14:36:08 +0200 Subject: [PATCH 50/63] #3021 Refactoring for String validation by Java Bean Validation: - set ERROR logging level for validationLoggingLevel in log4j2.xml --- webapp-resources/log4j2.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp-resources/log4j2.xml b/webapp-resources/log4j2.xml index 56c759e1b0..996e610ff7 100644 --- a/webapp-resources/log4j2.xml +++ b/webapp-resources/log4j2.xml @@ -46,7 +46,7 @@ ERROR - WARN + ERROR From 85554b83baf2c4be9e498f00334bdb2316ca6d77 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Wed, 25 Sep 2024 18:00:54 +0200 Subject: [PATCH 51/63] #2992 Prevent XSS for body request Added: - OWASP validator for requests bodies - Annotation for XssValid.java (used for custom CSS and user comments in alarms section) - Tests for validator class --- .../WEB-INF/lib/java10-shim-20240325.1.jar | Bin 0 -> 3861 bytes .../WEB-INF/lib/java8-shim-20240325.1.jar | Bin 0 -> 11573 bytes .../owasp-java-html-sanitizer-20240325.1.jar | Bin 0 -> 241952 bytes build.gradle | 1 + .../scada_lts/web/mvc/api/UserCommentAPI.java | 3 ++ .../scada_lts/web/mvc/api/css/CssStyle.java | 3 +- .../web/security/OwaspXssValidator.java | 36 +++++++++++++++ .../web/security/XssConstraintValidator.java | 21 +++++++++ src/org/scada_lts/web/security/XssValid.java | 19 ++++++++ .../web/security/XssValidatorException.java | 25 ++++++++++ .../web/security/XssUtilsTestsSuite.java | 13 ++++++ ...XssUtilsValidateHttpBodyExceptionTest.java | 40 ++++++++++++++++ .../XssUtilsValidateHttpBodyTest.java | 43 ++++++++++++++++++ ...ava => XssUtilsValidateHttpQueryTest.java} | 4 +- 14 files changed, 205 insertions(+), 3 deletions(-) create mode 100644 WebContent/WEB-INF/lib/java10-shim-20240325.1.jar create mode 100644 WebContent/WEB-INF/lib/java8-shim-20240325.1.jar create mode 100644 WebContent/WEB-INF/lib/owasp-java-html-sanitizer-20240325.1.jar create mode 100644 src/org/scada_lts/web/security/OwaspXssValidator.java create mode 100644 src/org/scada_lts/web/security/XssConstraintValidator.java create mode 100644 src/org/scada_lts/web/security/XssValid.java create mode 100644 src/org/scada_lts/web/security/XssValidatorException.java create mode 100644 test/org/scada_lts/web/security/XssUtilsTestsSuite.java create mode 100644 test/org/scada_lts/web/security/XssUtilsValidateHttpBodyExceptionTest.java create mode 100644 test/org/scada_lts/web/security/XssUtilsValidateHttpBodyTest.java rename test/org/scada_lts/web/security/{XssUtilsTest.java => XssUtilsValidateHttpQueryTest.java} (97%) diff --git a/WebContent/WEB-INF/lib/java10-shim-20240325.1.jar b/WebContent/WEB-INF/lib/java10-shim-20240325.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..59c87d5140955a75196b36dd51da6f38aa6375a4 GIT binary patch literal 3861 zcmb_e2UL^k5=}r#1nD5efFKA+2~DIc0SPrR)Swh;p)84^gsxO+(!m1K1q&!35=2y_ zNGF6UB1jb$L46`kTtzmKU171jeQ$Si{&T+knLBqf-<+9?GNj$H698ZY03?kAECE{# zL^&gL%wW>`NVp7&;>JaBWBlUw>9cqMit@8D<)OUYbVI<9`fwdnGbjSSh#++s8A?NY zb{R@bkV#z?CbInsh|rT)yP^eGkgpFCKV5dvA}Q__6-Q&)d}v z_g|d9)(2d}7?mC7V1EB*CPZr(0E`x;L$rKlEc0KoolD+0%R8Bnk)uv1P(_5_R<)Ddg% z?OkbsLxa(5ITtSNiqSU$gEJee>~wna^vmT?CfbS;yqC3Rao&^8sXd+A8;9M_FM z7UcxDvc623n}qXn`Xo`t=~m$+{D4iF%MUlwMY{zqS^4J~UiZQ?|g>KvFVP<`Ig$F1L@>30TU_ zg$V8`MPmx2%+0NDVeR#p8A6#3+OI6w%5ddQltl`P_7Y;zIuYaZfm_ z2Mk<-8sw+FRO8Ca{mZJD&I)2&G!SNqyi3CKSX0FN#4kxA^Y6mpv&|B60NeBhx`h(P$j|G}5SF z<7lWpI)c_3?4Y*h9WaK@J5Uj(KB{=!P=5JwFF=7;L+xtNdN?~)6v1*xpFhA<8yy$B z(=f}I0Zc^jeN9OuBY5RqV6Rr%=oQnd<9aA>(J4Q{<<_E$kR=q#>4 z6n|i;B`_}Jh`**B`#sR!*zTCRGLPs+kyzf?0FF3zSv#Gxq8g^`uCPNixIwOo^P~Wd zAdzz-wyEMNl8>Gk*~|y;tHY5aNJ)k_CUVak27x>(gJPIuue^9h?>-=u7ql$Smj#eAs+FNnZ3KxxPy{Ug4};-(xuA3C6~b#pEYE8$gzmNM&Hh3aGD1to&La@TkCe4udAdLM2pLod^`jU*RjX29(YN z6a)b7^C}Ft>637wKK(hG10`@R^@c3n1ocYysg4|Qz|K8)-(=Vbt2|6Ev+KiH*$WWr z9j&b9vxWzFu*1VcFx+m=_e(S4W4RqUYsc+WR;=~l{;4-F&2{Z&&U@**;;61Q7qL9^ zlzI88dx-6{{nPcQpFh!e*zGoeik(gnTWGraTSfd(70MHMk4%fTEPr&lR|Bxtyiya66?D=+pA@Kw^N6g09!X?7W>QQWwT_|buB)!HV z7A8LzZLF=sliPwTRX&d|%w4#_nvk%iKFk%!L%%r$_J$UdRNQdP`MM(c30(9 z&u)=HQ~p<2xcGa9J>kplch7Y%`P|}}am-7tWZs7ydIZ7{Q)0<$V#GT&NRZ8#h?;$= zyhbdcEXl!Mp1&AWZY)4 ze`!y6P*#>d4qIu~kvJ^KHPVIdmb$N?oM8sOnus1DUUt(37tNhIDqG%Wrx}_}JUPZR z7~t0*egB0m`Al|Do~#94dC~Q$!Suzn=Aa6}!mAqSbZ|R3v9hG?#U%#$78SA>sCrPP zTo+$u^{^)4-tnAcZB@}9#Tc<}qURUQyT zAraiF7bX~^ra69{{UE%Ii1maaAs|z$5x!OuAF9;cCIJCT|vlfqksnluBL)<}pU9s};84GbZ1uDiRj)Odm-&L|m*& zGq&=BF_w}J7f!-J7n}!c7%P_Uz7U#W)N0C<(#}5=SyPMaA2K8cA9OH-nuI#A$M+R!u$3+Y>k) zGUYkdsKy0ZU2VRG=P%-wUY6Kh18TBG83JjzXuq#Dsj_*)*Z^-})YDgyxB=S~TH9sx zA2>i^nAld>7E%2(VyX<@Fe-5o<+ve=f1D~+7H=38(Lp&<5r2y0ALFPpdBdoRar5@K%j`cn z3&ZFrV|!agzc0GCH`MmUw;8gTvIVw<+`0z02KwIe*bLOc@Xdw&?V4|`#viL>EAjW{ k!6vaMrCYak%KuHgIUP`jbd<^f0L+w6J1qd9$VC12JNqGcLI3~& literal 0 HcmV?d00001 diff --git a/WebContent/WEB-INF/lib/java8-shim-20240325.1.jar b/WebContent/WEB-INF/lib/java8-shim-20240325.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..d2e2bac67c626cd6bd75f86463fd6489027d2d49 GIT binary patch literal 11573 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≪)UQuTyc#wD>o)abDZ$G|Ve z8?E%htv4R~f~<>SoeFaoS1CyfLpmKx-w=<=(z?e4E= z&vS&#F8V`9#y#X|A7EQ&alA6lCN;Q`GdUH zo)&NDrT_-V(eI4Lwt;Q?hsdO0sqLI2bA;`wTeGHwZNmsxkHXUAEDza|NM|6-EubOi zNaP&%fbZ(x8e?6tlD-7rVdwEJEA)Q~F@ukr>UZt^ukYVHB=T3-{bOZA@vl`ghkte~ z17gRl=YAmte$~V!V+0kVj$-qRNvsOjL`SREm-^@CszX$hosyJ=aM~Bz8&h}y(hdYd z&iK4hVGy|bD+?@eAV+a`!IA@I0F!63q?T)*d@9Nf-%12SzdVOuqEIfDX|MVO!3hQWb1EWV$zySpw=Ti8nomxhhKUK?e|hHE9Pe z@v|GjNRY&|d{fFa#dI#o`cI?8Zy%YUeR&jlq&SoPv$d>l9@*_33bi$;D^P;aygLx4 z8qv&^Bc;BepLNZ)Lsw7lpC+zXM_|0zIbNGe@Rs%A$Rf}+;xS9^((`A?4{AbI)>oc> zTX}cz4Q|(4v#H3ZXsx7?eNbu!M0+C5C*S}}!48c3C8lN-B+o z@a^AFa*lEjRDbNb+c()H2wPuYmTMsT`x%YF+cYXu_G&OuvWUbQHJPunN>0U|Nz-94 zQ5|BmQ()$bq`$d0sFtSVE_SxXHzZ6Y&#)%pk=AAw*t`=SGpL%~U(8#tQlTXiCj z(@r&07ad;ZVSNV8#wL%~o*5-lPr)+eR>Vi22tVhZax`!c?;L6R_^4?z|Fve2OsM(1 z1x-ZsC_b*DESOM6!Txe8-*U+^;#zLr7WwRgyVkOvic`0OBpnewIpNIeUKNn?H5=~m zE=T;b7gl{hQ=JqKy{+~`2O4ArXJ^5qUD=fJOM4g!{u2NE}c6@j?UH)XQ9Ndqm{Dm}M~zW*(Sg?bhZgkL7HXgbc9ARGW8 z8ykj_;#INOKFJnqC9?U6bC)EDr`spz9W~gCYT$u}_yHPgS^RgfqWkap=>Lzhw~UG_ zTGmAq2#}Bf!QI{6Ex5b8yEg6wcefDS-K}wVch{zIcjvOt+2_4?&bxPyeSgfcdeoR> z{pnTTob^@JR|@dvgpF}NRxh(U?U132kL=~QS_@Ao8c*qNMt~lE<*?n~yfUJuYeVJeSLrH#98CZ;&ich_5%u!G~rj2k6>+&3!fQ zPpmuxU#y0&ZZl1X6%PIg(V@`ezkKz)ijBw+vZNr6fyffVJEfU3V^Ho3i}xiIWM5w2 zZdYGIkG`@Knegp-2#652C-c%YyCjXe>lYs6#e(EK95y{wQSLNQFIKnYAO!D_?f?r2U5+9 zm+?S`N^eAGFgAvqmCz5m$cW5L&i$Ta=w$$5Mr<)?MxUN1T05Crg?jr+PtADH;d6N=V(^<(+P7h(fAMV|E_V)rjeitj!INlEX!&&R5{%Xp1ScW@fQ9(f=p~>3#4Ea zUg47%Q-d{5#Jo|#*imUcuYZW!j*)xsv39zZ(h>L}e5k*BiiTOun+hYTXbicu=;eZxWb5fEoKJqh}=Z8h*VS zUw$qJ`XFp$#&L(T`zhvdM1QsM4I0{r)&Ee1)qL_qxF!2daJ@|PhY2-aico`YLvZX& z8{xMC(r@pVPs5P0ktl^F^zws?lRvTiG`?Mn6I}lXfvX>PDG~62_3rmQjXM4_wE#!^acP8=MvM$TTKJ|+cq6rm0Iy=iX)ZQnRaPw}Zrw@rwQBy7cYca) zF*QPWH6r<|YDew(}Kh;30ldc(^MRm6UWWr+)l>zV8ulpev4 z#@$u36j74}VvS9`gbWPgSi+^_ZUJ>Q>P%C1uM(RY%1v>YcHn83pr-zc03I{E^$mx8 zEF#5E)AtZuJ%3xxD-+MAo7x5C+tApt4MTm-Or|5ij%r1e#xz=NRGGN6)6J`yxO8fEqA+Ta4 zMKbN8eFeREa+Iq-U-~NrF!=H*4G=gQ8s{jyjf`Pr-S;~ys8vkdJM!?hF5O5n`Kkh;}+El*C4+h&LwRFRk052Nr%SW3_EQ}shg2tOC z6fHLT%urfyD2ZfljO}ti9I+yUbjBeh1_}K{y^7Erat!`{`IB`0NUcbKI|K;B)W*>f zxoOMr2K^uO5ZSqW3G>J2_}_DH|MQdl-;|O5|8J%LAB(Jk&3|ccC#n1wL8Sgw%8%f4 z{gN^T$>*>KMa0;~0cFL6>|lR&sFYo#WLp;_7vz#GoWX5$WiziwWoP-pX@Dr~66S5f z!~^*YE|=`>n#}J&8qfn_^L@If?nmO?aq`XQeK6}2PgpJbD{!~pL>tj}vLP2zp~h49 z#1N^{gK%3BTemCyAwmkcCql1l-TMPcmn1I!Lh-vUT1eH`topzpH0}Fb?1&z7iJr0^ zBaI%bAM4Y{he40KmNbY`1B&0vN~ni10_bZ>5|cs;51PeSs7gI-|K{*o9uyWFEac`U zaRjjE9Rz18Uac7)l)EL;s6>z`&k{W^)c>7DEmJ00%|RYyj{0UgTyRaX>yNlt=M|BY zH^5wiGIU_rK0v4(MOLZBGZ^9Gq*rLHDau!P$+K8t>4j!yo~htG|Cf}_pWGl24U}6P> z!k9>86KdVhWde|RR0!@U4i{#?uZLsD4Jw>HTuygav1lkf-wRPt9LIsnR07*z#a}69 z_v3F|eFSu=lKdG0n$#tl$>=2r(cvRg`KoQLxRS!S$&HC)GNmPO5ArVlDA zzi!wWSm=6&Fb0m1Hezf1RWR-RSs>li2e6o!CP0Y6l}46(D2@S&;zJ`_>M3!(&`HN6 z7?@OSCToFYg!DooggIRdmz`Fk%GN4aasyfvBN#nU!H%pCtWo3QmmoB ze8cOLHTOR2hM`qABkRimERKJw(1tNds#ggycQy_)8?Wl#n`5jAC|q_JaqI>EjnO8~ z8)iAh&`wMEVHS|nXF;aSP$lY(#tPfCM`=;r_&E2ZfZ$KuMNtaqwSIWblj!95kqb#&0f;bUR4u^EstxC@Mp4ssI#JtNAa<+57tuQ|{OALFz_anw0<9q+EIgq_YcNpk7KOBL3nOne8p)3Ip`3Ci{ zs44-*+wCWU--PpDqV_bWUJOE=*nHG@oqCtx`>vj6 z`>2f|PxQ=lo6(=ISvjaDY&<8BPSpsAWEq`10Sb|jca`znf}W`h;biuSuZ(R{oaEwY zoXGH;X{DSxtepJ0>G(<$aPJ^2AXbt(na?XSncB5g{*I_x#>tdeYqBMv&J`bnZ`j=?U;acYOel{ zFVP`4?SrsB+5vMnbzL{a?D47d>r5KXGwMc7>%poY2~B6sG08<_UX-mX4AOJtg_o?- z#dqmxkJMBBXzwu6J5<%BMV6NikyLLpP=*NeJd1x(v88S4)la&a387oPfmvmZ?twc* z?A1T@tvS+dJOPwkyyYVOKCvvb`G-QY-swpUy-QgbFW-rM^W+5W5>0<(Hauqa=hb`I zOu9$ryzBh~?}~chgCf3s`tby z$B@sTgYWw%s8EidW6n0NQ{Ax zvc(_AZg9j{vcl8hi~S6xAh?{vDMqqATR0G+^uZJ(WgQ$>dFDmr% z)hm`vzu~m8xd(Te9!=`^(E=wvJ^fh03a)K8S%&^>(jbj<*k!X)D>fm=iOZ9qjEdS* zdM%R_7Mo_veg`$0O~m71#j7%Q4B$mSjz?cxfA-Y6M#`>?2af}mH3!P*a8Dz6@ub|! zZdsS169g@5ze{fFk$GySU8Y($Y)_+hyQnmet!l&FfN0%Z!ij}7*pp_ppSf+Bu1Nbu z75wUM)rx5J+=9z;B5gO`k?Lsqxge8ed?QwxbB@k#NmrL7PyO&G4!x3KDXML}yzSSx zu<+I2WTa3G?egoF)OV<2Yx4k_scxBLNb2AO;4gaCV2!c8HLl%Ex3_eF-B^$aSKVrc4 zTpzrHho-L7uvoWw(GO(#{b(_5P*&ZydGqS!f&wUgall$(>r&w4Jrx3`sP22p1ZE zi|7wn-{ZUtn$VU$%D8`e7qqmGPNndijlH0&EGbM6R;YDB9qqGOy2uivewHW_#+{<^ zTY;pXGXHeKWh^ZItg*>k-SO7C6%yMKL?d&zSk%&T4=6jw9?}uw&*Maa&;HPKLm3g{ zcFn;Pq(&Pswh(6AeG0`=+d1MJfa9zT4WS_l35^dzQ{xkB%8>{Vq_2XL2++$t^gJlD znOqk-8RQLG_qmzHE4l<#^~lRjbNG{u5W}U)<)xbGUtp$hYy7ySn+Cl3K z=GF8SWXrlDb(&e`AvFWBv`oQ0RrUPP%})|^_WJfMUfH-pB$^9>H;qMwkWzb=aU2dUta9BopodS;;mHG!Fn}{Yal2%cB%d*|& z9WfG&uJE)!h7fL4N~|tF$=qMQgyN)h{+j%yjfbW5qkyi8cWO{sC=O1AY3|9J1^Xxi zvVP6IXOC1kY#cWCg|`0USp0%$;@Wj;a>2=$^8SAqJ?!0DL+6d4f{g92c+ai4W!LicXl&}(h$C%C;8@D7m(3Ri)fCakgbukYpr}B-oIFAa@w^-*H{P&hG*<^PA8}(2 zanvxNgm<>ULCar=)k3IoqYo-}>Y=<7Fa& zr%?HpwjM6znulb-HZQiAM(qi_%BIt5kTOpZ_+i@NVosk#Gs77W>hf*s*XlHRSTG-#i9i7cp z*#;aDJR80Co9agI+lw~&SK@umXv^i+(&h3ng!qS_j%0LXj4?6s#rgtUFYhY99p4D+ zfHkKqz{X@XGi#Q%u63S6k|8^TUHz9M7!{m$(t7oe8wNp%e=LzQ-4SIt7 zp%mtolLxt}`wKnk^%U7YNG2xvX7Vta<}uA8;Ml_;hTWaIS2;tYh2$v5Tc;7;Jwdp8Oo+Ql^; zXg;1n2h8P7t#gKCRuXx*mSGHe1#WUhy5eUNZESV+ub{N<#Xe&H0|XjW7_d@5IH2l( z$pQUak(jcHo0E{8?MG#ulZ>75e-(ITByIjfm1nTC>G*&R=7#|Rzq0b2EdjEC@-Gu? zR<>nmKR;0EqCaQnje-6;omFr)?=wrz+IT*u8&RnHMzme3X{*#|R zz9cfPJxc}cYa5!|YQga%uB~IgFs2%#r_|&yslJ3WT9%xQ*~Ns|K#kRmyyh@@yw8X! zO3|`8Jr2ZairEtWx1V%8yVIfFT0zxllA===LA4^jW3Wp(_zqQ#+SaTgqZ1Whlsef8 z2u+_4lHdImd?sWtY+dTptFch}L!eiq!O1Yu(r1R{v{X0VJ_aHNT^iE#PuzS$lVn_7 zTgk8HRI?{14Gcl*JKKU{ex`@79`9jTn=`tW2Eq(N&nN>ldp!qR8{R_(JYDh_2+i!1 zGVy6B>=r{vXc%O&+Nd@#Vr0_eE8;Y0jW2k5(~=L-meZPOycM6uYYsDvVLfU9%JwNGp!F7xOZec7J=Bib%onGG)88@L-*ffzl$Hb# zEZT1|gaPoy?mX-j>`#nSLv5mf7v(H^pHBdL2mCk4`gRW(iI-2)_hGt^mcQ9xf6Md6 z13!idBLraN-tQ0J3x!TN4nQFU@AkW`bAfVUh`0LPX1R=(0uXNu+iWrb!vTm_hHZ8k zfaL(dK*VK@^8l*06+@;H?25QBb|fQxk53eXHi9`)E*!*tr4X4}n(m_NUOCAARSGwsI#(rpZVO@rn(~ z*}^$x5mpeE4fgF+**aw?R8m2teg{cch9wTnOS-NvCS~4ozY;@b%IT7;YR;Fj+tGfy z>o?=t8jxiia)$mbYUt{y1uZAZ8m-$(IF`zb>NV5aQ|feB@m4!jf^BxCJHc+)b*Z}7 zq$A@k;7U!}kP3h8QZrWTh0`G+oe9oN(ByZVwSq`R$~wujH{6hcDKjqYOt7ma4kIn= zllD5?nvlf?g>9I^1y@w_#?zmoo?O$q+0s>X+%tmaUb}E)OpdW8&$TX*mz*35hIJ`E zNHKXPdz6$PFM*7@xXiJA*?xp*y)=q6qUw=`@&t|T3V!zMHXh2BzFc)CU#X8>Pr2~N zmflgx>^+XZ4Z*Oqu8uEd{t+a1iOnT4|&5qg$~_}`P-hNYx|SZ=jbmSBcZQ6 z&;)#a*QAxX2>eD65S>4<$#>~jg4{lXX$51#zP(5?^>Bevm+=L-s8 z<ZOtp;s;TNM%GS zF^E`X%-^;XEjT1m1)2gtkOw?v64Kbby}($~=7h|p9C(Ho8+*=G8wVSE_Wm_y9KI9T zX~_pj+*@4&^S?Jg7-k}6AdFidIJM8?WRT0+xUD@qR&tp|Kj6@%Q=UyRNvDDzVr{_L0WeyN>@_MBI>Fy5d{!h0H!L7|j z_&BQI{-xWI{TpugpTY9Dx~G@YVA7jt%S?NGRg{f&K(%`xV;>sAb!h^I5QC_`f>Cp$ z8%6>Kq24OG@o?O(zPXfZT4B{q9N!G|Uz$KRQVR>n&(~iA8(S@E({55tn^vt?ZT_Bi zw5~Tko7YJ!JMQTY3vOi@-DSZ&jz5~7rP@uTr#emy(Z6gTj($=NSD<$RvEy0y*)=~R z*uEvCz3=RGHb3IBckb^w!@Yw@AE8}0<}P58)mT2q3!3+I&y;)%Dv(09O)e#4Nyd|L z(?By9G}9;!BTAlSQ5dTgMlPT!vdWD#X(ppmpP1^CPUe#tGt?*vqe`x0Wefpp%ZwSh zCy%1D59?K zv4kPhM6zQ+oVk&Hz-)LtR{t9>axltRiY8tXlTyVRkz!&|sbAF(Q>Qo1c;steBq1Jt zSi!iHvFn(8f8$Hcb|9Q0#Own0B;Mo z@J3;WY`z-$c&ti%lDDUHk)E~~Wtq3yvM+7Z;_1AIj39_IvZ6ocdcrCgQKX8ZdK4Qy z@h77cd(yB&&s$cl9}DddVj+Jy_$3Iwe|EAr7-7@<>D zv7(8AiK*o1NJA;J>R#0wr=ZqV2sU{3D(t~y!Q)nDHzA6|X@n-|zl*CfGzvjkkj*er3CAnK_DyW!Fh%cbGZofdjv8YLB9~k7r~+ zMB|0W=K}cE^GGj+I}s&fNTM#ac9szje%wN@_STzANSQl|Ihtj=>bTM)glIugt=tKp zh0Vp}kE?r28HUnHlVoh&^62dS(vJT&)>5gcBxestDOgGJb(>j~NY~pb7P^ z?c{FmrnkrEi3}h%KP-O0DS^Z2(^JyAS3R?uwq@Qh5sshkmUZAb)hRpu23?Wh3ZGhE z8cjnJkGRC2CPv8zoj9604^nHTra)IFqF{!{dOOc3l{$myQ!p zu-+jM=GiIIurnHRtt}zVb$gu)eutOq?W=D&s2!LR`aG5&ZDy}A_}rzC9C`?p%S9AC zPoXe9diX@_8ouE%T_24wqHFjkA|e_A5EBg`NX5WhxHOPr{mT*}aqDx|ta$j!C^RT$ zELJFvi{HT2itKH?Hdrp}OC;dPXX^}oSb5;~YbBP9ncsjA>p4FN+SyC85;tn8(CcsO z1jYG|KroiTYWbvi-PjvRe`@rk|Hc-#GoT14r9Z7459O|Yb7YtjdSKWTdXy`N(Q<$e z$@La40prZI%*%z>Lx>x4$%%{Lc~Rw|I)M}v_iLgm;L=3Th7qcX@@~ARLCSI5JQcxLh-)j)m8(ftmGy=g z=zT>-bV%=kp5JeRI9B%lSAjJkC!vAjrfgy)xQJ_%9;=^dtbW2P4~n1(W? zPS&{FcyI+NY|um|j=$pIzP}!jwwr}N}5VkMO#UNxB8MglA%S<0ZO7#A0R6q%^3m)|y-eBK0xv3?ZL@)=6TZv?+K zzJ${9TaLyoUx6CEx{|Z1!Q?iNlv+M3$p|Y~%#APQw3K>M5|mmaAvTYp^}b}}+?15) zae8=3KAfsN3COtHOjw>j^z!dGww`F6P(F{qzH@$k?_uP4i5S?rp~nl@xu-O;fAp?o z1itd!V<>mZ;Rfv8TNqtDycTTKQD6kf7R%=n3C@yGktq`?Q05#WB_UF!6#Gy82s1^x zl35K=V@M0X)fAjk3#LCOaRt47Po zyUi)<@yzyYjy$$W#j={YQd+a0MV0`|_}QdM%HeQk?$jdP*LAWqvp5wqT!z8Slx3lD zlzo%(s>~gp7+$;ShY&B+s)|~YYXgh7!jzT2P>p*tVM7zSInyBXizgm*`?6m~epOo# z#bmfWIHFD8y>O|qowIzPqre;2>hoK?KHws-t_k|O>P%x%oIh_xcpPuVl-d?`epp9O zB}mO@?|xdw?#gU|9xlqjxlv7^o%O8_2#W79ew%4P!JtXAX^zgHK|cEy@`^q^b2>X| z@QMLZM3GA2mcBAtT-2E6!M!DbK$@8GCz_j*bu*~>px^7HM^Ko;;=G&cMC21=AcHXT zPAHLp`5(o*^~B%=rZ7J7;g_!kSL75)S%vhI@>IT=@%Q(XN$+q4mwNKB@2I4gn;_l^ zZ?_)zPkIh`Jt-L<_nm8i*StHd99L&Z!i1Xr$Rl#POGhx{eidNB9cmvH6+MxOr$Tu< zmkB>55#0CoMdSTvA!0~0{r2dTMWb4-pllR}U)3ihfCVBF000p01NT!RqGN~<(J|76 z0f&I3J4|_!eLT!9sGspw`F z`G_N^`|VRI*2;16jERrFG2sHJuT+}K>Bv+QkX3nmGKo_YCHGvV7BG2kD^#EAGZQL` ztUaJVOMZ-?=`KhwcEAzw%WA0@r0mS{tE)Yt@h2Cbq?GeQJOAbz4#AZo*!HV`Uj*wJ z&6aFzBi#&O$|H7=OEVKmhv+cG3*4re(>jD9d#|iJ)sWd7s#4aQ=o0wmHTzAY6EEdR z`XXLCyGL<^ZmWCoV1s#{eTXK4N?$37VIH%s{R(0QC%@s*7!Qo#NFi05NczBRQAdE! z>xp~Jb5h}T?8D>dj9F@@n<7bEdgoQznHG4|Of&D2He#j}1aF{8x(yb~rW(xQ7(|%J zeKUb?pqDzWD|s~6wjWa;EuEAzw-?Lo?&0<8_O-=-)sq&#jrO8CCsC%C7N1X*Q(^fw zAAzjs3|2~#6}+vmR&H2P0F!=5JOYBQo2eXj`qIExJF9Fd=$ml>h!LtqBWDw0rWEIe zFXfx#wLX)ky!JY(;FfYnGLzRvW7L->$h2EkcQHRf?gu*kh+lk{wDIaqD0O`>myi*{ zH`DQnqL=2VHDg@<5XmZHIebACDM2zIXM@Iu6DUZC1vTg(`51120 z?Ga@^o_I@b@+iStnyqW4(B?Ou+Z78Q14DYRO%;u%*kL4?joE7qD^&OU?W=sI|WaZ1VD z?4EP&k=3`^QzC$?Rr}OxYNVl8+hU|4WSiEN9T?rKbf)UUN-@K>{YepTf0=I>bU>7MjOAIT!5!hFh!r_FTifq*6WHaq9-{JaEF|ROS3Nt^lDsIQm#fv%X1S4ZZp{vhNIb4nEJ-EOYQ;pE=o^pMQk%e+$B?hJ-Jia z+c;e`4QkuvjjBMOmNIKQW+5u7RnR4&rOwp{2Ed6;Br##BGUEL=MTl zH#PB}B;aGi0!U=yJ;l#Rmj#(b9YT%MeKyF%;gx(zhg%PCr>QG?-y!}%UkBOrwRRzV z`V>d>uX0#4{{|-@^pB=w<9{*(>8`(3`BKQdHx^H1btv zeYupJ^(ve8utX$C>=SLf&GHwvrmvgH7gf(<0Fhl5yTu#bXRU`x^djtmMGhrVN}0NuZ8wgnyyF5cuR{9VrX8erj#m9kI-(39>q+6Kb8skJx;b*z)NsM)O?u1dG69`1&@ zG~c-)TJSV?2zfi-4(lA&ZIe05KL`@MQrLG&wQBQ>ZA8h;R`QaAJ?oJH{aaGSi7cWoz*NBxE^#5rB@7D}7F5LvC_X+7A}^n+;O6F7^uHY&TAHu(h92=~aNvr?&%H8ci;7t8d~S zNu$jVt2VY%Q8HXW9`?>w}0P1q_{c+R);*tO{!Bh0dP1v7^g*3QSlJoSSgKO8)$k3Z}lMNPF` z;~3?r-nt(5UQMo!gX^}78_uU|jgxvFo2N^!%Q&t_(K=6YFz4=*6<%)7c=s=NPweY= zHwziIi?54z&RQMoyn_X*a2X&=wgVZOUxotTY%;cTGPq$le4Up^oL2Jh_vHS zd%JD9a{VAZ=uA{&QPAoVRIx_L%DxBO_`ZtK1bVANYq@}$?Muzn;Iw@<(xu*8klS?B z+;J%)J#+ZS+fF|x>Afc3kTrQf-*nhM2UocQn^c2O*BbUry-AbgctKn@ZBC`F+sGOR zy5+tk_8#aF85{l3MXoi&mDSjrW?6kvu1i+zV3a!1~qFw5~=02;&u1gjx^(0gR`W`Tdw!+bojZU%oWT}0* zy@-DEbUNjHV=m?VrtoNe;Z&=UtG(nnV`I)%t&o0G$B)Xs&YgOc_x7e?hc3gCDud=^ zYIYrU?IP^>L>9%2jYjw63KpyL_c z0C5%Fb0}?|@t{6$W$3jw7Zc#k_uNd=>s-W9I%^^}S&nWz=og_XY(A6~j@`aq6q;qI z3WMs2f@SS26Fv7do0kt|cn@z1>6|^3c9IWa0N7|&4O1S~IJX3gtcS7J#c6ts2coWk zDxUo-tOy`qY(83Hid~&^%WRL&c73&k?Dx8}UYSX(qM%!6O?9cFpm{FZu>;~wRAB!o z7x&_WNnJN*f?9S=`DAoYx@wDyEcJSnEOiDz^MtUnRdUjz<~jq-vxb?9x2R#7qavz( z{d-|Id{G0V(~jCfd*WZd%D9o~!&i)=dt{);sVnd{rgUQ8+Sn>b?}FA#phE1yxJkRp zLb_AcW3~}yO~ISp2A~<#$Xy|by+&;9f0OYm#jX{VemrZx-r4+oVZFmVV|HO1^M1E! zwUOHf*8xX24!MoU2Dgt^c^XJYg_VN*HVj0i!g>|mS$FcvqrQlu>)W3;Y~rA0J9V+v zV_vtY(JQl5%Y>X?5UNhgXmr@Y6Pev7lkh#L^_zvQ=^e+9L%VQ!y=1ynM_byP0a zbC~7LE*OLyckZ_KRN2)ayF>^0EHlWC$Ydo@z4Ox6$2zHZR^Qj1 zTYx)n_Ve6e>85VX@%&NcM$HP8VSV6XDP}6VI-0Ka*)wi9lHorOljT3ZeQJQk;`Y)_ z!cq#6q+QolS%9Wj<=+x4QtRAIO}~IDQak^~$Xkf?WZje&EeF8o3u@e=UYD|F!=FaG z9)_b{%n3^e1z#zZ_ZKbYW*M^c1%;Eqd6zqG=JwB3@rtDl*?1~{PRpDh>6E8_hr{ka z^-#m+dCjb2y=>6iz9Blz@R8%SS-s=FbaCZY`P;G7{bUFOlHvQ!-fVeLPiu>e)x>JP zc*8yJig3Ds&X%Ggf*iW4S|y_rl1|>~tQTF(ZhQZd8lW?{PPOEGdS~lG-_dDRbsXyi z$I@);t)*AgXwbARvjI|-ok}h{4Nuv#tol_qMelm9UTJ4TfL;7}b}X~PHZH&3y6#zD zm78*WaN}^imTr@l?gs`4?$_?dUCa@g2|&Iiv5jMD*=Oa=R=I zfd;}kjg3ui6Y-Lmzgw1iNLSF(9|LlCfVJ^g@!=}~s2~$kR><1}fdbTm2BG@n+2+wh z!`fgqw3JW_uG;!sV`Uw80}0j`6y%t48Y&9z_UsmvC|6p`wi5tAfV(*Bb0?NE>7&5EK@ z$@;ZI(z? znrfH63LKFUm^yDW4;=`)gQJ6qd%AC1=Cvr)g&yy-yS83aavq z1%v7p=%`A4;(n$1+11sW(zXH$&L;gQ4m7Cf$HYgNoKPw%CT_*${zvf;Cnc4%v^~70 z=yQo^%nPU~sz*Vvx7j@qa}}QqYCD)18|B$sdv+8R5k_g#6_qs96e4dGY57~_!E7>F zoz>;F<|{WXBbq~v)wOPHvJ0&vl;vd=6?0U7^SDwKvhNeMl;u^l{#wtNQBMcd*6;1K z5wXEn7Ax}GWTz|YXs87-Q;m*(moKKflsc;EhiZ8G^|>eUXlCal2WJ6i+ls+HgcYx) zojXHQ*8OChsG+SXugVEkRxrQ&14j?~AhkJFR7g$gM#eP79688Jj*ga+y0SaXnxoli zgg^6_+EFRsc=&lFRa+yKXL@(UGM&F!lOK0NZ1>USNTF-`7kxIn{f{ZJ$uv#HY%rK$ zi;Gi<`MgWEUqwOXM(c2Yh;m$eB`F!iov5ljKW|t8Q3b3otj`4sYvHn2{7gwxW%7hw z2|KCv7i>#PuSL>XDJ0juJQal_RTj5JjFWwacw_B`A!E*3895RG`64 z?J4}WnIQI4Ofm&$E1C*ih;+ZCqD`%()Tq0M1udPCRauRqjyww-wVTb;x;1XcXe7i* zT8_={(v|VPeL&p>go7FC{QR71vK2R&4sG_Ge?l{Ao%Bpm8_dM``Zk-G*Tj8EqP=^C z?;YnWD`IQtkRmiMNUSYt=)s{m>6uctUiTTKatP${ zJoUa-y{|Jq`5v6Uyn7tId5FBbv+wgCw7)z|NTkfl$UT1)VHiQ2X6ODrjE`2BLSQu9 zF1nlI#Yi`H)iE+=by*!ug0IFV3tug_M9vC*S8^_kH?4RNHSnWK$I9BrxYA<@ z=!I?;H9i?$H@Igu$Z2%#xU*LC*bHD`;}6A-97k~62_9Jk#xaFrQ)BnZB*K9p6Qgzt zM+N}J)<|L_kUQ$jEO#RewuO;9kV$|w?L!dSh$%n{><6GWxdt}WimZt)Gx3QpQ`weT z<2ETZhOJT~gmY7@4!}^a_J>fc4u(*1_k~a*L?fu-A-O8!VYw>ep}DH!;khcfM7C0K z_pc{rfQS=yc8HU7KxZSi00b~1Kn@&tsW5VOIX!|0pf{NWHeD4zV1TCq_$F1rs#@1I zId|zby=8K|>=SGR<+}(N%ICp=B*-1Y5x+}$a5je=CkLM@Ckb954iN>$YX){#=6DkpEHlIkFHBI~8Ji4BjG2KuDxMChd2MC3k& zS-)da9msv;8uU2Ac?khtbIWni_40G@@yc-!@S0Xf?do|j4E(+$^^-1=UIa+d@nd`E z!68s;N91eDfEs}|8oelxN7uiaLO0xA#EZ0N#|^V5-i@$m%I~e9?7Dix zUbPZJJyyuG!Majn8<{1TPsXF{-jAZ}HYs8ndZKLp@qhA3`dAg#Xtt_&p&8?#v_#tU zT+%66bGZ62J6Qp@PK8FeMXJ^9z`JQJ`T~Ns&BBjGiO_u~1kzHRTCboyIAb#zG^e-i zM80#0wv!WZb$v=?~ z+*8VhA1O=?U*abgZAHdi{zd6?@r5)x13()oTF) zg(%9e_EHv~B7#%5T}=2~WJ4Dz$#a+Let(caza2qhNV+bQ=h7GE6VwlW zn2<+?m-tA1n4mIvll&*_$@fJpc)D0lXd_hfbQ1?BKX&m`QP;Fny(z(Rd9r=%Dk=}V z+j_IAX`=JtgUV=+^`FpHp6J{P{P8G4XffC9h_E)K%rk}~8s|$t2mHfmsAi|FUnTVC)?nCoa z%Epy`r9_UjPN=C_@)~i?(JSF&a)gybFOmE2I9K6g^x0KI+W4JO_K+xOsi-_VDRb(^ zs)ELG&4^SHV^zTO#VHMATmLB{N9IJd)XiU(agVey4>~t8^nF@8u0L&~HbsC@&$cm} zLO^2OmOH8oNr&YWzIaP-%z$s?OA)c6D^H5f>epG@eni+8btTJhgg}gvloY~1NDio zKcir$B2X?5S?8J(U#I-3dL_<$XEer6^*CT-%IeD^^nwM8?lI$Cx{smXLg9m}c1<0= zKaw`HzTs?_J$w(eS-Wd`sQRiW)EoCmW~#D0VRiO9lDH0;D|)Pnk$<<6LMI5A7IKo4 zOk9U<7%k29rWgR<{mUr6BEB&k32dzLMqah`DP-E|KG^1svlOzdU z1|{IIC&IO$uRsgl?F#~b{E6%xfoHr}oLEBp(8eyKF@7!mGQFrx{99tfkL+?2f>CT? zjZys(&0zTjro`H09z1|Gkrk$>#;E;>rl|cUAh7|bN)P?=OR@`*JCeIYKwjk1>r1E$G7_r!aa*7{d`zn#`P6=+*g1V++9<$20o< zxOaJ|DK0%A5PP_}?SdqKO&m7Xk(g3inN}pMwBXNRqWnBlYH2d1a)UIuQn6HXBCpg$ zGuM(bue2aNL|J}bQ9?xuRfTr8#ImHYw17;ZVUDacnX6RO^x`E|xnV4~)P!vYK(eni z&lDmyR#0k!hwsAI{M(o-;d|THogneCIBk?GMEbpw6b5!N2g)GY6hdw>2hMxi+-fi^ ztQOi}TR*AvbQ}$sP>rl7*#xDLM(l6&E*1Tnr!گ_&d$Q{_@)g%r(eC6>RzfF1 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

    %avVUg=MDQ9%6z2_;1h(ivna=&--FX~>E2&(@M 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


    ;4g%F=ze<6#ESmJYx| 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

    +g_Bz57$rGi^;41Y|1>B;J9B zZ+D*&T>us?&MMs#w;VUnDjndW8Ru@lCCulEJr$+aWcK(%99;{r!*71t&!gajT$KS( z+Bv**-~kEYd2{DbfK>uxgaW!?=1bTGD+C1Lq><69Kn$k$FmyZwZ@Fr4QM0H7_?HkR z=Cdky$Pxz8Mj1rE+Oi6v2ru8SIe~z7fZPhA18=*y^kD3M0e`!KUU=Ob#ih>hhtO~|A1*q57b9Zo2!AxFJ zH#C6vjX&dTvv%8J>Ae8xL(#LYaAf|FD$EjCWH2)4jpp;L<_kk1?$qp>0)CMK_(J7?mfk!5@;wgic^;rse}n_M zk$O=90RAup__&di{?h2J0lL9@NrAYjxzXbLz{2|K!22QsP}&K?`(gr6+7$-)g8J$J z&<)%M+40?Z{`CU%QG>?|)ob-qzz^PQA*@&+mYd?9&5w8Qe?3IEq+VG63=kUxbkr4!8w-COz#4>7@F?&o$S4S9kYNxP zs0)Nrhz&}+41S&8g1;4e$pB&eDg4(#(g7C$Y5Xz#xqzP_Hz;c5c4+-OKukcMpgL7| zoB?al+yZ;CK(>f)O#EBGJ5_e90d0>PuYNm};PqULbifx58!57!JCS6mE->FZ)5y?R z>r6FaogtX8TC2E_Ct*k}P{}lDZECERt0!BKR>)!eZK@<17@NXktE{p;Cls*s*3$8I zPWb#g-|O=xv15U`jy%2Fdx*G7ClDiJta5CRR8EA)$qfTkKU@= zADa?~5B??>54XouJ3qoiPeorw(@bHP=)0(4c1d!otQwL$jH?PQ=X=9QE;3H?Vv_nM zB`;Pkfp5j{kWz|dAryp>v6xFVaU_J5nsgw}Nf5GOD2QwqreZ$p=w~k#%v~f$V+(JV z5i7Q*S69Z8dryZw#)OGZN|9?K>T8ZA&xNlOkejgi%VG%0NDd#H4bMU-$qXwiu^=49 zMw#&-Fe)brXIKjVw8}_E+-w$*XgdWya}`}eo{?RPbxq*SQ=h|S(W%kkiCR--yc)+* zL-^Oh9d> zl%(EHZi5+~FaO>?d_+isL3PH$A|->S0Xm_{+Wda&1A*5IM&bqjjGx&N+(qt(-6M-R z7bC|+xoom$pPqoOWuIr7t;|fSgmHe*Str{cdW*ovOSxgRJ7~OIumN0n{!SRCa zMEspp;+>ndyU_8~;b#GGU;1zPfR+`Z+TsQ)foS0OHaw$!I}2AOzPO{Wp~!xeU8mMg zDs4nq7ZbF#za1%$YG6_%?7gr`&E$t2787gv4zSW546BUe>y;Xu+=LF5;4^wiw7T%LTIw<(%e1h|+L|0S4b)iK zdWcsr$qE+NwTA4OM;^0!u}RTjRm$zf<@NF9m8Z!HD3g5`lS6WsTbWlgI0Y7F@Ewpv z#=z8lxjNM}#)nxf)8w)wWeC-^8AZxRmFq{juyq3mncQXSLzzeVs@n331t0|$@iAeQ z)x%YlWzI?)T1@6rk^ZvOeL?Ol);Z}l?LuN(lqLKlwyD|`8 zfM1FM1vlBiBfC6U-4V~qoE8=o6_n~o-SIZRx@9TbqvP+2`s})Z@#s5C@_K86b8ChJLuI_Y=KT2Z_Z6+={%03p@kb+66goq|f$i zc3MgBozhIrt3YhGM5AQU8gr5=BH|A0I~@|l0v`hKtz5^m(=#i$tbKIbL^CTUX;9HKX)4UDN|KK0C8srV5`|_INheaNO&tgl zP^4+|n{wyqgbE627Iw-BG=>!I?1zAxnXhUxHZzkWRzfo znxjoeR=u=sH^Xe!vl&(f76v9#sZM3=L^>I)!5|o!qeAZ=PLLzWhKpkDR~X{MTZ_-? z8pk8~OEwbZegj+53)nIgM@?*v_F^!xwSHhIpnyL z0_{##^HS?LOJ*wU4LyaHhrk=sMKL-=fg3B0CJ}~RcV~;CIXGhBwa)gL5{9#M;@=^q z*8P%72y=KORZLIX$7^i2q_ki>!f(qv$Xmp@-NZMu6%rJhJfI(x;Fktsmh}y}I)qxt zJS4_W=>uelQb7AWqM0Hk4-?ox71g$AWP`$pCV?81kCQp?IZx8yIJUVh* z+pjTs&y*;-W@7Oa{9+*Uij2Gt-f$X?*B47AZHsON6zBL%v+-6 zS%yj33k2NCs@OB+0%e{c#S1T5ykFHlZf>EJ*D%AQn zC$4IS+GG--frAHGY zn_7LTdI>2TqD|p-Tk;yf3HBzTNYNDYgKwEhzCakj`yG}QFaXBMJvuatsl982jBD4| zUny{{AGs6TF0Wj)cuubbDR?fg2q``14j#}z{qKuUy$ok~cyr&qP4BZuOs`yj+;CTC zTbSo!OVuQ>!`~(0e&N>Y^awC-qpA+%z$ak?y^wlIcLIDNcZ;ZAd@!uKhr1@>dP0-J z_=!Ei3T7YEzqDq_T^8(IvqR<^0ziV|+kul}1DeB=jvr%(NQmXm3NgsqU;@07OP{g> zAL9m>4Hn~soMMfG{vO^FNOeayu~*mSs#FC3A@4x$aZV@bW`iWw%;q_!19&}!qe$0U+yy3nw=U=*`qZ4+)Y|MScg=R}aGIlNE z-NV3Q`Y&SU>xJyLz7Sa6ns{cJMIPA=&$Luz2Ipv{O*30Hm<8UG*#)5=xK^0EMf<-h~*`p^{`%hr*7;foeKum+5n)! z2!7%-xAsq9>#x%9dZ3O+1G7ncwHabL1qIp#Q`tHkP>Ekjvi>PtwQhliIhWLQY*gc1 zlLF0~N(yplymZ0G%HkiMwRPxBiK+UGFQ~%o?~Z5+oZWR{YY?a&x3;y%PJ!!N)7)(w z$cy1_V_MuzsDX7pn9#|C?eU7MR3*yNb({JE_ZN_ToV<=%ix-=9!!7^bp zGJs98N(`qGZ|KFO{BV=U;5x&RUEIfbteL?BZltLqypa>KDcc1FhO zNDT&wF+=OPFiD~A5MB+22PQ&ZgAev;%PIX+GbPYIEuc9jZXit@7^fK3xG8$p66e5B zjTiAvEP8d}w8DEKh~8lpwaF^V3bqdlW;msx-#XM8hhu}O*|(4Kd4wS1I`m21d{3$E z;!qG@m_*bXOw{^wjV5Z{jM;(Z3gEg-_enGRg=2#g{OgrAAL*bYT=I@bm~8wRkw>gM z_JsJ=CqMWONSJH_4l(I4G)y+`8JG56$N!{20m+~BKHRHRU`lY@Hh;0Vg^YEzlZ;)=9+L$ zCxj(8ppj!XXtn8Xh;VN|1EQH!zlQ)cTE|{{oAU3td zB_K?7sI?uJ1g;;>4fn%5kvUnH*xSkQ7D!IN%?pgt?(=Lc)2^mA#Iin-b}ZH|=ms=f zJ}8?$sLe3gF6stU%N~^-RyRz`e#;K*2lUm$L7z@GgLIMGN|q0CfNIZc94H3UT9vX5Obgi7a~JH$oiFsr zy)Pu*p|7O#ZLi+ybxcnG`BT9dSVP|{+tQ&DcF6k<+>3|LFWLZ2?4YslfBIrB>Cqph zzySc{{q+9%f0OGh|At&wveI`nGqU}Up5_0YU{}(yU7$ziv1tei=^Y;)M%M!ZHOj(I z-?3IIvY<3j)ECbpCCJ`bwBRmsu~#JLi$o*!2j;#nfL}HzE~XV+6Y{!DaGc?J9)A5i zUWWsqt3B)+!a;N8QMQ{I3JJx$>TuiH%Zro=S<6;tv}8~YtTF^O)q?{bFi@ksHDNr1 zavXezAdu3*xjjhz@dX1pF{+cs_y8&jT9tE4hvd9+YQhM4Ly{ZO&y0?jmwq+N3}e1P zAi+JksFF2$Xk!Xwb9EULom}dbtOnUc`icux3@Hae!th+~k!@Yk8w=(SMSxXe^CcUO++${|CcPXMK`3RfOT9oOq&K zzH1pb5wq2AO??!6f;K9(NB0kg zUEXwq^6ZB;?fAE}>Hi)~|H-m%|4^s!BR%WM+1Mq@xnVC*$VL1Q`7fZX1cjmrZ$uOX z1l-m&8C&t^w5#g|pAByQ!brPmeB<<HG13?uoE48BKPsx^1kJ@lVJt2tQ%(22o4MAfeR#Y|}A-PKm zV|KB4^=~GgjlxM0FEE=dac*=vk&%WYZik4c2Nsl)PLkm{LD9|=1NT331M@c`??Aua z2W(byonl2g!&>XNamc*gD}XD*0Q}aC_&33$m`N%gAJf1D*4*h9mp0{|3hamuYVt|6 z`|nl}IeIxf8QBhsJHh&>i@`UJ6$%ax;6~Jj9SEBR%m8|y?a7Zq#WoT(qY`2AbFF#T^ApZ_2o)m~kZmQlV$lX(jCp_{Se0c5EV zL&t%|R%DPOASlqeN>Q3EF*F7IqYB9^Z_GraM2G*(vs%x4OQaOaJbQ23X|4~#$UL*^ zD7M@3J!XC_e!=j3Zi%ykP5?WUJ34K9K5u?*dTw``e!nk*0J!eraX#&-1CQMLfhvii za%4qzg68Gt8VK5;5Y^fVhK5MsP+CDqVq)Xaj$7IxW=BL2Kd2}>JME-KP~e=~OOH@U zi`9aaEbl<$D%-1$oZo_?*e=ddv~b;$!oZE)PH}DpgtBnw?^Zdyv4(qfgt(fymBhI2 zZX&+o!dx%i@WRAexb=jU6-2{ciTD+u F=tg~(aFB!co>TSnKHqp3}in3eSzr(?WN6=%f%7cT!NTNL&MyEq5-3UKit^B3lzhBc%!iNSD3!b>duNe99NW>R0*Kfi+A zc87wx^d;NB#9lyPJ;|Qs#`{!!uU)pS;<=sUO_|$p2ka%!-y2=|mI#P%SWfvPG1MLA z)oRD|r7b`mXdbg~tK1k2;T0rXW%fd=n+Ey=u}Ae53us2dsP!ZqaG+o4gN7FKMaM6( zPQLajY}L_3Zf3Ut?#cRm-A8rk8s_7dFY^uAN7|lr#?oZKcpdCvT#&WGP55(VIHB01 zaMPX^h^iaA8Z*z>BN`=T!`tvhWu>xP)DD&UK)wUpC=c4p5ZW$JM5{=IVpBL$Wi0i|SSe&#cWM*x@b zbVS++yoa@arRn(OwHk_;@v!kYy8|CHGzGND@^ic0gkUNf#1}Ye8I~yNdRZGhN8k08 zIz2TEYk&cfq>^nl>sWTySO=~>P|`SQwf=B_bo`&%&IBIH?S0^r=*k+|w}g<&PFW)R zQkE={EDgpw#u#HKA&Ep%M7BsMYsnreSrRQOk|=8>*;0|}ciz@{$Bf+j`TyU0=ku9c zcfQYap7WgNJmhW;Z?2+dUb8 zbb1g&&o_Q!rs-^H)bsEy8j^!k2b`|p_OJD~SKlL|ZIF4QcddSw83Sf6L)$>~8coh( zpJ>XVVvf_J*kJP-cD4tOi&Nhw@KzD%DwdbWCK*z$6ml-~+&OZo?Xu~62bqSZk2AHI z(`VRaS~eD|_rwc#&X;L?60>LKVU6oJFqV}@t7~#(+o~BA9)4LjN{(jg7HaKjHxs?l zG2QMasfM|m>n*oO7?-=Uy}YlSI#L%oOO>BO<&wgw>6CR3*})ULzg)Y!)8TnQdE^vb zuc^#2@hm}^C~mgWj9VvWt6n$q%2WkB3qYR~;vOs0>wUt~Q^BhEa&>vD=9WyUiPo+* zia=w{4Vefl|ykmd>&MuY^uRyl4{pex|&ok`{i}IbdPF_JF)mj)WJL&jO zTWch|(DXaXdk5q2!aUEDI%Rc&9;PI{N`D>8WpMIfPylQi+J`35imH0Dn z&!ola91RkA!ptzWu_}J@`o_LHJa16wcO&l(t?^HD-HS3&ZYr;8&H9@7a*N1nE9^b#6=55%X#Di(K_hvDm(lo{B`>R}xc%7b0*Uy$}#HFamNAsyS40}HN{ z@h(*LH_`W@Z?=RtYTvH)6pog@l_#Ini>|+yFOx{I*#H77g@2YJnp94*(}2HdpBamesW8z#}iRNeF#+twMR zs^}`slNDzAn@x00H|4e_ml`DbwqxYqVrXu2OYnRcm+w zx|g?)ybEEiH0xv2-PfW2^wM2}bBq*W9~Q&QT!!7kP-8Pm8|c=SvlLawFg;Q>J!rQ& zsLJq}HcH%rPC1p6>%4w&&n3$n$99Dp_0Nss-i6#M8692S(wRP{uGfWaX7A9)wrx#$ zlKq-~u9I5S0h3~A5^&j`&8@TWwE_24d83B`m5x0!N1gQohm6;bZnNW;u{y(<=EHmI zQf&X)d={r{BQvp!+nu=UJx$OTq}I)by)^Uax@YqNT_9zf_fbx+C5`!-{?qqwH;syx zj+9fHC4aa`FE%k5z*nSQwTbRQs&ji<=6d1M5lQh?$Z6FZsvq_4#IFgnkmR{}O4g$b zN$sOA*IMed_AsCSQIscJ&Fp^N^{J`tQ& zDV5t6R^jY^ci)vouRN};kx9j6>>WXJw?1&|E6LR!OzLT2F4o6>gF-?WHOqngy-sFc_wapM>z~)%^qao%;x_-Ya|0L? zrnhR~(p^fU4_@2#6mL#e)PL1k7ZT4@y+Hk7Lsl?%%;Z=v+oiN!u_Z=I{Y|S((tS47 z9aZ7)^9pt`X`S8}fAO~8BlnG-MUz2I3yj5re37D4muZ4y;%{f2da_{g;7Y8fqEvoi z*3R_8E;p+UW>@a4=XfwAC00(u6Yp%F@`?TI9kG98%6!VT*2QE9<@PbW&P=e<`ka+& z-d*Zp-0o&nIwtk-u5(b018YiQGm14mk`)}am_D08^#^_ zZoi(@s8cHz*!#Tc(207+^#RpNH%xRmhAaxZkb|M8@)m?W83Q8voX@LhmBg@wE|^|8 z@`--lj%l}ue2wEVu{wYGz+oA#Q{wSQBduF@GwGhaS(En0N;~;N&FL9MTZYTV{8?7i z`9~zV)T_?5h55OKcf0;GTAJAH%(zv)gJQj}y6D2I+$iiLjl6~qmUzsC9yKMwBiR|+ zJcE8bOc(lTa#T9(5A#t5HR$f{{l3Cx6EkzfTX34L+}h6s8M@QreQL0^5d6&&&-974n~Nc zBcYo2qk=hXDObs{QEETJmo&OiI#lg{@tC4y?|~9l|MbRjs(ya#@$XALz#5Pa3Jr=% znz!u!#~W9LJ)`Uwo01Q!q^;9`H^Hp_np*kwxg!Q(kAkLjwOlmZ*7jc7t9SiwQ`q>3iggyt@d&*Nw|0WpX*2^ zOdQuOg=cqLO8h)>uho`g^4Ka*J}wpRRdS5w@OswD(6rlEENo(XM~|U@@flth3vH@& z3VJ*1j3{x-r`9)eczsZxShcj z4_X|2IFm6h%Dc+jQb7UTGt78#Yp(p*r9u7Axg7cjGPq{m>+Ltwojr2%VD*I1KLUE;Y^~!`1SpOs$SA{xnq< zFLTrGp5^+-KrpBIP|NfqOPWKCro;VN6qlIHWL_xVk$vEq;w$WVs_LQqKW7zr2aLmx zXABs)_Gb;9`;-*tIi!RPwrKe{71F$oxtS5axK5R3s73Kmc;?Y*8D7;W)@BJj7)H|! z?dO$fDe>t$k{mhB&D&u9l(A_@@le!2*F^i{_l%!%;#6PWQ~Vm<@a7Zu*Ur?Ps_mVZ z64MJd${1`=>g>AgU4B8)E_+Q;j*+dU&55(V3P17FuCEXEI=J>+wN$`>m|G>bSAeG|_7cfwlr} z!A#Dv`%AlL)_hK@OZHALPr0X5?%R^4T_p6txQpW*-$uIumWlZkn-PUXn?!o2;*_hO z-3qWY8K@Q|n{JNw6 zTo0!$@3>_9j#TFzbn0?ac-disF(JKATg{tj9oKsmpoPT~*_p;sv}J0xd(fx%4&t8b z*PZO#WPEb-K;b+i*Ll?W@B$&TvN;%`n^V!3Y#5B{O%o z$`4vqr&Jl*YR9&-OX?;@E|r7ws@J#ZZyt{LL}SjEcAdE-Tsu{p zLwB!z;1xINJ@wIFO=i3{>6n9!XKH?Lg(|#62P2))XY+;!8IE{~xM90vO;V#)xi!*N zQ$&>Nvleg;(@qb&WC;pavOn-<)YNL(!PYb^r&X7q^Oaxhqw9?Yjr{w<;Rm?hY>|m7 zlX_yTIVm-=OGY)fI(k5?;pXlkR<}pOAE?TwzbUWZV&9UqP;`Pm>H(X3nmwwpb4uP| z2KrYH!>NO{JNeeAJ5hr9a$cvqNcq}Kz3O0kp=tirSn9`B$uAoicVktPh9o-_!>{=t zwwP3_2{_{SO7zy}b-b!apG`}?8(riV)(znq@_)qGE!si04=UyyY>$T4yb*DRb8j5fXPRmF`EzM2T(OrtuT+kWJ!au+)QHv)xOi62NmwR+Y=Yt7 zVXMRZyUerdD^h3!F3Hl$uBVA-@v=xspWuC^NikvWR2LJFV{+}WvUGFc%$-!TEY%=C z@l%H`TA#`}yR#NQ?2kFoR?cT9QkS#m^Z8vZHM+erxzT-}E!)58gf#~lxk)EjqZxS? z*!Ybb*{N7mt<@E}^)t*4e=m9fZ)rjyC|DQx81G(1!Gd5xP*YPQltD^Q%cey684NeI zz;KfV0dgbQW1wZGwoT7aTf#uiP)}RS)J)t!`|BMd%Fi7|zxD`$+=}2)1AqLR0uxU3 zGw>3W;0YxBnFkV_wG0Nw1ez257&;jD&r`kh#}1wz;?AC)&S;c_rz1+-(+}y5-R6e$ zMQ(EeCpvHQMq*s?u7N1rvQkX`hydR<0*n1F*$)+0EM4@%KOz zs_|#w33obK%edRd5+N>4Nu2#rlL- zVa)s2MqlEJ3H>~C#|}7TCMYtzxVycUp{aua>5jsa2whN+8R)2NwBG_6kRh=w!><#Cwtnh^MbAE3*S~9&jLdn9a}q z8`&%X`}4#gVzWver+!=pIsscA;tFTIOrA=*!t3W44~m1}lnR0=yqjUJUc%BsqddTM z7-|?tcvJ!@1ZnzY&waLNpy>&qsXBpO5r~W%E2amiBfU|MroVEx<-)B*s`a-Ms}P8_ zz~SJbD)}BcdCPY{X64~3Re)%;gy{R=FGMn(kGJx*g!{l2S%3;pXb*$Tov69~v^Y`M z1N&3bmXCCiZxsVNPk=}x3$uL1qrXV`-tGL5xLj{Tr(GH_56V!sq;aeFtUv;3wYl$p zT{8xt7XVZMruNC+<)Nf`{2HhK5eE+V1sqETx)y?`rEe(@14a$t_7~D9D*x-97eF@n z5+udj2|x(Mt~X0i+OB927{I$*^#BmO@tzKzXn2zeAT8v|1WyEXbBzXwn($bzH@8H{ z&wh(s^nK1pkqp@q4{Ql%^?V@9BIC6BC7o6nz&Z`|0&SV#p`9nkB3;5$!MD1(0f`%s z;C;fag{35rZ)><9G0vzxuHJYQ+019O>fD_!5NAU{Rl~hqW^oy)2@30p1N9`Nhr#;b zAwd`vnzY&vL;cQ|07D)E?Fm|1`R8$=SVi1wq3eTwsQp`lkq`cFA{tKZ2^Rn&fgOwQ!Y&mm zknp5&0hBsJZABU;<2};~WN711C<`1Cyn-i@2tfS2n+%c1L0Y~JBm(f@5yi3sKIBk8 z?PZAcAl2JKLgF-S?KcA<=hh$)DzHNMajrm!DHe(QT`dMaXuK;Pastwoa?M^YJqSB~&09Vta14rr|+8mXOeB~8Wvw;`DiLPnOlX(k~BjLZX! z439=GTok0D==Z>EibcEPp)f5)TFDSA8gFQEb0MI@^Y=;K6;Ms_V4j3DS@V?5C==*Y z(m?tk{Kq4}x3-OcCzEEP&s->s0Nxw|S}H$`DK0^h`F-Rr?=o$YtRHEox{oW`k$ioR zOVgHK2E+>>_K3mC9H6@bsx&!U`l{*GVFA}3aN*hp?_LR)v<*VbGTM`Y4eWr2!l~+p zE1=4drpj-4bqq?zl7OxXFdIl1uYmeH8U2f?*Q#x@^af&#mxvKF{V!rjq?b@!7zoAf z=mla%mx!U<_g}=2F&fvH{n2B8RlqKIeDsuLqTC2_$WU zRW8qk6-yzFPS$;joB+rufQIKMa=Cv)|GIj1DH&=v#;#9l%0Lx-1yvveQ#$zKO3BNP zTg+E8(=q@7A;6d5E+1F0i~tj`6d8ph--C~iawX>gEFB2OIxxLwLB~$Y<-fb=Z>*XR z-ctkZ>5YO0C{R2wh5bEgW67SBFiizQ-veW5z=YD4tVHO)7Wj}?6=?Gl)tSe5(F_!t6{sly zt2)aE^Og>ZK@u#K^x(8a)*AQ2*X;t;EeBjO(%>6+1za^)TZu%}CE#+hm<4CmmD!v7u+ zEN8>AKEwCBL3y)51ckq7&8At(#e>(XU^N1m1YZ$6J3YkbGicvuKp28gG3zssfa5^$ zAv0feF5zOgJPiWD0CH9#0!tzg@vJ0B0ce2wQEXC~A5=TsFAjTZ1A}S;sxpko4pw~- z^;f2NLL%(HpjJ=5eL|Af2sCfM3(T7jTovx7EkesnTIvc=d#4n8w(uHg482qUivS3o zA@F*LNOLm{^`#U@E5dur;i(?;)}<7rvpN!u#5e%6{^^^wz~V0auWW{#oe6J{fv0*U z;{Qbs>CzBh;=)g05fH<{`Z!{nEVobxvM}KR+?+5PR(mP!_cbttGtk6~o!}Kkv3CjP z_fepP6sV#IPhXaTDWks(h3v`Q#CXCJd*S#~rsS1eiYJljL)sG_jS9zKH~%+yGQ)qu zQ&`~P>#F6yz>{_=!c#fmFNpG7$itUC)`i&mgaD z8o#}eWGP6SiE!T|wC(lJlLg+rkP|?96D+ZP2>1P{{{e$<)xIlcFSC!5SRUb8WB9m^ uHF%}+mRbplDTGUT;mHNlktO7%E0>LTQ-O{YysQNOd<9Eo=psR deleteUserComment(HttpServletRequest request, @Pat } static class CreateUserComment { + + @XssValid private String commentText; public CreateUserComment() { diff --git a/src/org/scada_lts/web/mvc/api/css/CssStyle.java b/src/org/scada_lts/web/mvc/api/css/CssStyle.java index 0021b3f7f4..8c919ec8c1 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssStyle.java +++ b/src/org/scada_lts/web/mvc/api/css/CssStyle.java @@ -4,10 +4,11 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.scada_lts.web.beans.validation.css.CssValid; +import org.scada_lts.web.security.XssValid; public class CssStyle { - @CssValid + @CssValid @XssValid private final String content; @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) diff --git a/src/org/scada_lts/web/security/OwaspXssValidator.java b/src/org/scada_lts/web/security/OwaspXssValidator.java new file mode 100644 index 0000000000..739221f3a9 --- /dev/null +++ b/src/org/scada_lts/web/security/OwaspXssValidator.java @@ -0,0 +1,36 @@ +package org.scada_lts.web.security; + +import org.scada_lts.web.beans.validation.ScadaValidator; +import org.owasp.html.HtmlPolicyBuilder; +import org.owasp.html.PolicyFactory; + +public class OwaspXssValidator implements ScadaValidator { + + private final PolicyFactory policyFactory; + + public OwaspXssValidator() { + this.policyFactory = createPolicyFactory(); + } + + @Override + public void validate(String input) throws XssValidatorException { + try { + validateXss(input); + } catch (Exception e) { + throw new XssValidatorException("XSS validation failed: " + e.getMessage(), e); + } + } + + void validateXss(String input) throws XssValidatorException { + String sanitized = policyFactory.sanitize(input); + if (!sanitized.equals(input)) { + throw new XssValidatorException("Potential XSS attack detected"); + } + } + + private PolicyFactory createPolicyFactory() { + return new HtmlPolicyBuilder() + .allowElements("b", "i", "u", "strong", "em", "p", "ul", "ol", "li") + .toFactory(); + } +} diff --git a/src/org/scada_lts/web/security/XssConstraintValidator.java b/src/org/scada_lts/web/security/XssConstraintValidator.java new file mode 100644 index 0000000000..0915f217fd --- /dev/null +++ b/src/org/scada_lts/web/security/XssConstraintValidator.java @@ -0,0 +1,21 @@ +package org.scada_lts.web.security; + +import org.scada_lts.serorepl.utils.StringUtils; +import org.scada_lts.web.beans.validation.AbstractConstraintValidator; +import org.scada_lts.web.beans.validation.ScadaValidator; + +public class XssConstraintValidator extends AbstractConstraintValidator { + + @Override + public void beforeValidate(String value) throws Exception { + if (StringUtils.isEmpty(value)) { + throw new XssValidatorException("Input is empty"); + } + } + + @Override + public void validate(String value) throws Exception { + ScadaValidator validator = new OwaspXssValidator(); + validator.validate(value); + } +} diff --git a/src/org/scada_lts/web/security/XssValid.java b/src/org/scada_lts/web/security/XssValid.java new file mode 100644 index 0000000000..6923019fd1 --- /dev/null +++ b/src/org/scada_lts/web/security/XssValid.java @@ -0,0 +1,19 @@ +package org.scada_lts.web.security; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Constraint(validatedBy = XssConstraintValidator.class) +@Target({ ElementType.FIELD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface XssValid { + String message() default "Potential XSS detected in the request body."; + + Class[] groups() default {}; + + Class[] payload() default {}; +} diff --git a/src/org/scada_lts/web/security/XssValidatorException.java b/src/org/scada_lts/web/security/XssValidatorException.java new file mode 100644 index 0000000000..7208ab42e7 --- /dev/null +++ b/src/org/scada_lts/web/security/XssValidatorException.java @@ -0,0 +1,25 @@ +package org.scada_lts.web.security; + +import org.scada_lts.web.beans.validation.ScadaValidatorException; + +public class XssValidatorException extends ScadaValidatorException { + + public XssValidatorException() { + } + + public XssValidatorException(String message) { + super(message); + } + + public XssValidatorException(String message, Throwable cause) { + super(message, cause); + } + + public XssValidatorException(Throwable cause) { + super(cause); + } + + public XssValidatorException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/test/org/scada_lts/web/security/XssUtilsTestsSuite.java b/test/org/scada_lts/web/security/XssUtilsTestsSuite.java new file mode 100644 index 0000000000..ed6fb9572a --- /dev/null +++ b/test/org/scada_lts/web/security/XssUtilsTestsSuite.java @@ -0,0 +1,13 @@ +package org.scada_lts.web.security; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + XssUtilsValidateHttpQueryTest.class, + XssUtilsValidateHttpBodyTest.class, + XssUtilsValidateHttpBodyExceptionTest.class +}) +public class XssUtilsTestsSuite { +} \ No newline at end of file diff --git a/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyExceptionTest.java b/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyExceptionTest.java new file mode 100644 index 0000000000..97d12fab38 --- /dev/null +++ b/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyExceptionTest.java @@ -0,0 +1,40 @@ +package org.scada_lts.web.security; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +public class XssUtilsValidateHttpBodyExceptionTest { + + @Parameterized.Parameters + public static Collection testData() { + return Arrays.asList(new Object[][]{ + {null}, + {""}, + {"Link"}, + {"

    Click me
    "}, + {"body { background-image: url('\">'); }"}, + {"div { content: \"\"; }"}, + {"h1 { font-family: \"\"; }"}, + {"@import url(\"javascript:alert('XSS')\");"}, + {"div { /* comment: */ }"}, + {"span { content: '\">'; }"}, + {"h2 { color: expression(alert('XSS')); }"} + }); + } + + private final String input; + private final OwaspXssValidator owaspXssValidator = new OwaspXssValidator(); + + public XssUtilsValidateHttpBodyExceptionTest(String input) { + this.input = input; + } + + @Test(expected = XssValidatorException.class) + public void testValidateHttpBodyException() throws XssValidatorException { + owaspXssValidator.validate(input); + } +} diff --git a/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyTest.java b/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyTest.java new file mode 100644 index 0000000000..22584408e9 --- /dev/null +++ b/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyTest.java @@ -0,0 +1,43 @@ +package org.scada_lts.web.security; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +public class XssUtilsValidateHttpBodyTest { + + @Parameterized.Parameters + public static Collection testData() { + return Arrays.asList(new Object[][]{ + {"Bold"}, + {"Hello, World!"}, + {""}, + {"Italic text"}, + {"Underlined"}, + {"Strong text"}, + {"Emphasized text"}, + {"

    Paragraph with bold and italic

    "}, + {"
    • Item 1
    • Item 2
    "}, + {"
    1. First
    2. Second
    "}, + {"body { font-size: 14px; }"}, + {"h1 { font-weight: bold; }"}, + {"p { margin: 0; padding: 0; }"}, + }); + } + + private final String input; + private final OwaspXssValidator owaspXssValidator = new OwaspXssValidator(); + + public XssUtilsValidateHttpBodyTest(String input) { + this.input = input; + } + + @Test + public void testValidateHttpBody() throws XssValidatorException { + owaspXssValidator.validate(input); + } +} diff --git a/test/org/scada_lts/web/security/XssUtilsTest.java b/test/org/scada_lts/web/security/XssUtilsValidateHttpQueryTest.java similarity index 97% rename from test/org/scada_lts/web/security/XssUtilsTest.java rename to test/org/scada_lts/web/security/XssUtilsValidateHttpQueryTest.java index 00902cfbe8..80baa928b7 100644 --- a/test/org/scada_lts/web/security/XssUtilsTest.java +++ b/test/org/scada_lts/web/security/XssUtilsValidateHttpQueryTest.java @@ -11,12 +11,12 @@ import java.util.Collection; @RunWith(Parameterized.class) -public class XssUtilsTest { +public class XssUtilsValidateHttpQueryTest { private final String input; private final boolean expectedResult; - public XssUtilsTest(String input, boolean expectedResult) { + public XssUtilsValidateHttpQueryTest(String input, boolean expectedResult) { this.input = input; this.expectedResult = expectedResult; } From 1a42801258d7ecf70ae6744638640d9f8b08b5f8 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Thu, 26 Sep 2024 13:53:29 +0200 Subject: [PATCH 52/63] #2992 Prevent XSS for body request Added: - changed PolicyRefactor for OwaspXssValidator.java - Moved files to different packages (refactor) --- .../validation/xss/OwaspXssValidator.java | 36 ++++++++++ .../xss}/XssConstraintValidator.java | 2 +- .../validation/xss}/XssValid.java | 2 +- .../xss}/XssValidatorException.java | 2 +- .../scada_lts/web/mvc/api/UserCommentAPI.java | 2 +- .../scada_lts/web/mvc/api/css/CssStyle.java | 2 +- .../web/security/OwaspXssValidator.java | 36 ---------- .../OwaspXssValidatorExceptionTest.java | 70 +++++++++++++++++++ ...dyTest.java => OwaspXssValidatorTest.java} | 7 +- ...teHttpQueryTest.java => XssUtilsTest.java} | 4 +- .../web/security/XssUtilsTestsSuite.java | 6 +- ...XssUtilsValidateHttpBodyExceptionTest.java | 40 ----------- 12 files changed, 121 insertions(+), 88 deletions(-) create mode 100644 src/org/scada_lts/web/beans/validation/xss/OwaspXssValidator.java rename src/org/scada_lts/web/{security => beans/validation/xss}/XssConstraintValidator.java (93%) rename src/org/scada_lts/web/{security => beans/validation/xss}/XssValid.java (92%) rename src/org/scada_lts/web/{security => beans/validation/xss}/XssValidatorException.java (93%) delete mode 100644 src/org/scada_lts/web/security/OwaspXssValidator.java create mode 100644 test/org/scada_lts/web/security/OwaspXssValidatorExceptionTest.java rename test/org/scada_lts/web/security/{XssUtilsValidateHttpBodyTest.java => OwaspXssValidatorTest.java} (78%) rename test/org/scada_lts/web/security/{XssUtilsValidateHttpQueryTest.java => XssUtilsTest.java} (97%) delete mode 100644 test/org/scada_lts/web/security/XssUtilsValidateHttpBodyExceptionTest.java diff --git a/src/org/scada_lts/web/beans/validation/xss/OwaspXssValidator.java b/src/org/scada_lts/web/beans/validation/xss/OwaspXssValidator.java new file mode 100644 index 0000000000..a6d59a1595 --- /dev/null +++ b/src/org/scada_lts/web/beans/validation/xss/OwaspXssValidator.java @@ -0,0 +1,36 @@ +package org.scada_lts.web.beans.validation.xss; + +import org.owasp.html.HtmlPolicyBuilder; +import org.owasp.html.Sanitizers; +import org.scada_lts.web.beans.validation.ScadaValidator; +import org.owasp.html.PolicyFactory; + +public class OwaspXssValidator implements ScadaValidator { + + private final PolicyFactory policyFactory; + + public OwaspXssValidator() { + PolicyFactory basePolicy = Sanitizers.FORMATTING + .and(Sanitizers.LINKS) + .and(Sanitizers.STYLES) + .and(Sanitizers.IMAGES); + + this.policyFactory = new HtmlPolicyBuilder() + .allowCommonInlineFormattingElements() + .allowCommonBlockElements() + .allowStandardUrlProtocols() + .allowStyling() + .toFactory() + .and(basePolicy); + } + + @Override + public void validate(String input) throws XssValidatorException { + System.out.println("input: " + input); + String sanitized = policyFactory.sanitize(input); + System.out.println("Sanitized: " + sanitized); + if (!sanitized.equals(input)) { + throw new XssValidatorException("Potential XSS attack detected"); + } + } +} diff --git a/src/org/scada_lts/web/security/XssConstraintValidator.java b/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java similarity index 93% rename from src/org/scada_lts/web/security/XssConstraintValidator.java rename to src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java index 0915f217fd..4d5a10f866 100644 --- a/src/org/scada_lts/web/security/XssConstraintValidator.java +++ b/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java @@ -1,4 +1,4 @@ -package org.scada_lts.web.security; +package org.scada_lts.web.beans.validation.xss; import org.scada_lts.serorepl.utils.StringUtils; import org.scada_lts.web.beans.validation.AbstractConstraintValidator; diff --git a/src/org/scada_lts/web/security/XssValid.java b/src/org/scada_lts/web/beans/validation/xss/XssValid.java similarity index 92% rename from src/org/scada_lts/web/security/XssValid.java rename to src/org/scada_lts/web/beans/validation/xss/XssValid.java index 6923019fd1..2514c3ec16 100644 --- a/src/org/scada_lts/web/security/XssValid.java +++ b/src/org/scada_lts/web/beans/validation/xss/XssValid.java @@ -1,4 +1,4 @@ -package org.scada_lts.web.security; +package org.scada_lts.web.beans.validation.xss; import javax.validation.Constraint; import javax.validation.Payload; diff --git a/src/org/scada_lts/web/security/XssValidatorException.java b/src/org/scada_lts/web/beans/validation/xss/XssValidatorException.java similarity index 93% rename from src/org/scada_lts/web/security/XssValidatorException.java rename to src/org/scada_lts/web/beans/validation/xss/XssValidatorException.java index 7208ab42e7..e7cf8a61d9 100644 --- a/src/org/scada_lts/web/security/XssValidatorException.java +++ b/src/org/scada_lts/web/beans/validation/xss/XssValidatorException.java @@ -1,4 +1,4 @@ -package org.scada_lts.web.security; +package org.scada_lts.web.beans.validation.xss; import org.scada_lts.web.beans.validation.ScadaValidatorException; diff --git a/src/org/scada_lts/web/mvc/api/UserCommentAPI.java b/src/org/scada_lts/web/mvc/api/UserCommentAPI.java index 281d12c19d..057d445ec9 100644 --- a/src/org/scada_lts/web/mvc/api/UserCommentAPI.java +++ b/src/org/scada_lts/web/mvc/api/UserCommentAPI.java @@ -7,7 +7,7 @@ import org.scada_lts.mango.service.UserCommentService; import org.scada_lts.web.beans.ApplicationBeans; import org.scada_lts.web.mvc.api.json.JsonUserComment; -import org.scada_lts.web.security.XssValid; +import org.scada_lts.web.beans.validation.xss.XssValid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; diff --git a/src/org/scada_lts/web/mvc/api/css/CssStyle.java b/src/org/scada_lts/web/mvc/api/css/CssStyle.java index 8c919ec8c1..16e5175807 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssStyle.java +++ b/src/org/scada_lts/web/mvc/api/css/CssStyle.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.scada_lts.web.beans.validation.css.CssValid; -import org.scada_lts.web.security.XssValid; +import org.scada_lts.web.beans.validation.xss.XssValid; public class CssStyle { diff --git a/src/org/scada_lts/web/security/OwaspXssValidator.java b/src/org/scada_lts/web/security/OwaspXssValidator.java deleted file mode 100644 index 739221f3a9..0000000000 --- a/src/org/scada_lts/web/security/OwaspXssValidator.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.scada_lts.web.security; - -import org.scada_lts.web.beans.validation.ScadaValidator; -import org.owasp.html.HtmlPolicyBuilder; -import org.owasp.html.PolicyFactory; - -public class OwaspXssValidator implements ScadaValidator { - - private final PolicyFactory policyFactory; - - public OwaspXssValidator() { - this.policyFactory = createPolicyFactory(); - } - - @Override - public void validate(String input) throws XssValidatorException { - try { - validateXss(input); - } catch (Exception e) { - throw new XssValidatorException("XSS validation failed: " + e.getMessage(), e); - } - } - - void validateXss(String input) throws XssValidatorException { - String sanitized = policyFactory.sanitize(input); - if (!sanitized.equals(input)) { - throw new XssValidatorException("Potential XSS attack detected"); - } - } - - private PolicyFactory createPolicyFactory() { - return new HtmlPolicyBuilder() - .allowElements("b", "i", "u", "strong", "em", "p", "ul", "ol", "li") - .toFactory(); - } -} diff --git a/test/org/scada_lts/web/security/OwaspXssValidatorExceptionTest.java b/test/org/scada_lts/web/security/OwaspXssValidatorExceptionTest.java new file mode 100644 index 0000000000..27691bc54e --- /dev/null +++ b/test/org/scada_lts/web/security/OwaspXssValidatorExceptionTest.java @@ -0,0 +1,70 @@ +package org.scada_lts.web.security; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.scada_lts.web.beans.validation.xss.OwaspXssValidator; +import org.scada_lts.web.beans.validation.xss.XssValidatorException; + +import java.util.Arrays; +import java.util.Collection; + +@RunWith(Parameterized.class) +public class OwaspXssValidatorExceptionTest { + + @Parameterized.Parameters + public static Collection testData() { + return Arrays.asList(new Object[][]{ + {null}, + {""}, + {"Link"}, + {"
    Click me
    "}, + {"body { background-image: url('\">'); }"}, + {"div { content: \"\"; }"}, + {"h1 { font-family: \"\"; }"}, + {"@import url(\"javascript:alert('XSS')\");"}, + {"div { /* comment: */ }"}, + {"span { content: '\">'; }"}, + {"h2 { color: expression(alert('XSS')); }"}, + {"\">"}, + {""}, + {""}, + {""}, + {"
    "}, + {""}, + {""}, + {""}, + {""}, + {""}, + {"XSS"}, + {""}, + {"XSS"}, + {""}, + {"
    "}, + {""}, + {"
    "}, + {""}, + {""}, + {""}, + {"Link"}, + {""}, + {"
    XSS
    "}, + {""}, + {"XSS"}, + {""}, + {"Click me"} + }); + } + + private final String input; + private final OwaspXssValidator owaspXssValidator = new OwaspXssValidator(); + + public OwaspXssValidatorExceptionTest(String input) { + this.input = input; + } + + @Test(expected = XssValidatorException.class) + public void testValidateHttpBodyException() throws XssValidatorException { + owaspXssValidator.validate(input); + } +} diff --git a/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyTest.java b/test/org/scada_lts/web/security/OwaspXssValidatorTest.java similarity index 78% rename from test/org/scada_lts/web/security/XssUtilsValidateHttpBodyTest.java rename to test/org/scada_lts/web/security/OwaspXssValidatorTest.java index 22584408e9..cc49fdaf30 100644 --- a/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyTest.java +++ b/test/org/scada_lts/web/security/OwaspXssValidatorTest.java @@ -3,12 +3,14 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.scada_lts.web.beans.validation.xss.OwaspXssValidator; +import org.scada_lts.web.beans.validation.xss.XssValidatorException; import java.util.Arrays; import java.util.Collection; @RunWith(Parameterized.class) -public class XssUtilsValidateHttpBodyTest { +public class OwaspXssValidatorTest { @Parameterized.Parameters public static Collection testData() { @@ -26,13 +28,14 @@ public static Collection testData() { {"body { font-size: 14px; }"}, {"h1 { font-weight: bold; }"}, {"p { margin: 0; padding: 0; }"}, + {"\"Example"} }); } private final String input; private final OwaspXssValidator owaspXssValidator = new OwaspXssValidator(); - public XssUtilsValidateHttpBodyTest(String input) { + public OwaspXssValidatorTest(String input) { this.input = input; } diff --git a/test/org/scada_lts/web/security/XssUtilsValidateHttpQueryTest.java b/test/org/scada_lts/web/security/XssUtilsTest.java similarity index 97% rename from test/org/scada_lts/web/security/XssUtilsValidateHttpQueryTest.java rename to test/org/scada_lts/web/security/XssUtilsTest.java index 80baa928b7..00902cfbe8 100644 --- a/test/org/scada_lts/web/security/XssUtilsValidateHttpQueryTest.java +++ b/test/org/scada_lts/web/security/XssUtilsTest.java @@ -11,12 +11,12 @@ import java.util.Collection; @RunWith(Parameterized.class) -public class XssUtilsValidateHttpQueryTest { +public class XssUtilsTest { private final String input; private final boolean expectedResult; - public XssUtilsValidateHttpQueryTest(String input, boolean expectedResult) { + public XssUtilsTest(String input, boolean expectedResult) { this.input = input; this.expectedResult = expectedResult; } diff --git a/test/org/scada_lts/web/security/XssUtilsTestsSuite.java b/test/org/scada_lts/web/security/XssUtilsTestsSuite.java index ed6fb9572a..31f453e33e 100644 --- a/test/org/scada_lts/web/security/XssUtilsTestsSuite.java +++ b/test/org/scada_lts/web/security/XssUtilsTestsSuite.java @@ -5,9 +5,9 @@ @RunWith(Suite.class) @Suite.SuiteClasses({ - XssUtilsValidateHttpQueryTest.class, - XssUtilsValidateHttpBodyTest.class, - XssUtilsValidateHttpBodyExceptionTest.class + XssUtilsTest.class, + OwaspXssValidatorTest.class, + OwaspXssValidatorExceptionTest.class }) public class XssUtilsTestsSuite { } \ No newline at end of file diff --git a/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyExceptionTest.java b/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyExceptionTest.java deleted file mode 100644 index 97d12fab38..0000000000 --- a/test/org/scada_lts/web/security/XssUtilsValidateHttpBodyExceptionTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.scada_lts.web.security; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import java.util.Arrays; -import java.util.Collection; - -@RunWith(Parameterized.class) -public class XssUtilsValidateHttpBodyExceptionTest { - - @Parameterized.Parameters - public static Collection testData() { - return Arrays.asList(new Object[][]{ - {null}, - {""}, - {"Link"}, - {"
    Click me
    "}, - {"body { background-image: url('\">'); }"}, - {"div { content: \"\"; }"}, - {"h1 { font-family: \"\"; }"}, - {"@import url(\"javascript:alert('XSS')\");"}, - {"div { /* comment: */ }"}, - {"span { content: '\">'; }"}, - {"h2 { color: expression(alert('XSS')); }"} - }); - } - - private final String input; - private final OwaspXssValidator owaspXssValidator = new OwaspXssValidator(); - - public XssUtilsValidateHttpBodyExceptionTest(String input) { - this.input = input; - } - - @Test(expected = XssValidatorException.class) - public void testValidateHttpBodyException() throws XssValidatorException { - owaspXssValidator.validate(input); - } -} From db29800cf19bad4129be8bd410057c0c160aa5e0 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Thu, 26 Sep 2024 14:30:10 +0200 Subject: [PATCH 53/63] #2992 Prevent XSS for body request --- build.gradle | 3 ++- .../scada_lts/web/beans/validation/xss/OwaspXssValidator.java | 2 -- .../web/beans/validation/xss/XssConstraintValidator.java | 2 +- .../beans/validation/xss/{XssValid.java => XssProtect.java} | 2 +- src/org/scada_lts/web/mvc/api/UserCommentAPI.java | 4 ++-- src/org/scada_lts/web/mvc/api/css/CssStyle.java | 4 ++-- ...sUtilsTestsSuite.java => OwaspXssValidatorTestsSuite.java} | 3 +-- 7 files changed, 9 insertions(+), 11 deletions(-) rename src/org/scada_lts/web/beans/validation/xss/{XssValid.java => XssProtect.java} (95%) rename test/org/scada_lts/web/security/{XssUtilsTestsSuite.java => OwaspXssValidatorTestsSuite.java} (78%) diff --git a/build.gradle b/build.gradle index e4678cfe1a..ee87c21e61 100644 --- a/build.gradle +++ b/build.gradle @@ -243,7 +243,8 @@ test { includeTestsMatching "org.scada_lts.web.security.XssProtectHtmlEscapeUtilsTest" includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" includeTestsMatching "org.scada_lts.web.mvc.api.validation.css.CssValidatorTestsSuite" - includeTestsMatching "org.scada_lts.web.security.XssUtilsTestsSuite" + includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" + includeTestsMatching "org.scada_lts.web.security.OwaspXssValidatorTestsSuite" } failFast = true diff --git a/src/org/scada_lts/web/beans/validation/xss/OwaspXssValidator.java b/src/org/scada_lts/web/beans/validation/xss/OwaspXssValidator.java index a6d59a1595..d24b38c683 100644 --- a/src/org/scada_lts/web/beans/validation/xss/OwaspXssValidator.java +++ b/src/org/scada_lts/web/beans/validation/xss/OwaspXssValidator.java @@ -26,9 +26,7 @@ public OwaspXssValidator() { @Override public void validate(String input) throws XssValidatorException { - System.out.println("input: " + input); String sanitized = policyFactory.sanitize(input); - System.out.println("Sanitized: " + sanitized); if (!sanitized.equals(input)) { throw new XssValidatorException("Potential XSS attack detected"); } diff --git a/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java b/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java index 4d5a10f866..772ffe8077 100644 --- a/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java +++ b/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java @@ -4,7 +4,7 @@ import org.scada_lts.web.beans.validation.AbstractConstraintValidator; import org.scada_lts.web.beans.validation.ScadaValidator; -public class XssConstraintValidator extends AbstractConstraintValidator { +public class XssConstraintValidator extends AbstractConstraintValidator { @Override public void beforeValidate(String value) throws Exception { diff --git a/src/org/scada_lts/web/beans/validation/xss/XssValid.java b/src/org/scada_lts/web/beans/validation/xss/XssProtect.java similarity index 95% rename from src/org/scada_lts/web/beans/validation/xss/XssValid.java rename to src/org/scada_lts/web/beans/validation/xss/XssProtect.java index 2514c3ec16..0f28330e94 100644 --- a/src/org/scada_lts/web/beans/validation/xss/XssValid.java +++ b/src/org/scada_lts/web/beans/validation/xss/XssProtect.java @@ -10,7 +10,7 @@ @Constraint(validatedBy = XssConstraintValidator.class) @Target({ ElementType.FIELD, ElementType.PARAMETER }) @Retention(RetentionPolicy.RUNTIME) -public @interface XssValid { +public @interface XssProtect { String message() default "Potential XSS detected in the request body."; Class[] groups() default {}; diff --git a/src/org/scada_lts/web/mvc/api/UserCommentAPI.java b/src/org/scada_lts/web/mvc/api/UserCommentAPI.java index 057d445ec9..77dc26d135 100644 --- a/src/org/scada_lts/web/mvc/api/UserCommentAPI.java +++ b/src/org/scada_lts/web/mvc/api/UserCommentAPI.java @@ -7,7 +7,7 @@ import org.scada_lts.mango.service.UserCommentService; import org.scada_lts.web.beans.ApplicationBeans; import org.scada_lts.web.mvc.api.json.JsonUserComment; -import org.scada_lts.web.beans.validation.xss.XssValid; +import org.scada_lts.web.beans.validation.xss.XssProtect; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -100,7 +100,7 @@ public ResponseEntity deleteUserComment(HttpServletRequest request, @Pat static class CreateUserComment { - @XssValid + @XssProtect private String commentText; public CreateUserComment() { diff --git a/src/org/scada_lts/web/mvc/api/css/CssStyle.java b/src/org/scada_lts/web/mvc/api/css/CssStyle.java index 16e5175807..cfe3b78f4d 100644 --- a/src/org/scada_lts/web/mvc/api/css/CssStyle.java +++ b/src/org/scada_lts/web/mvc/api/css/CssStyle.java @@ -4,11 +4,11 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import org.scada_lts.web.beans.validation.css.CssValid; -import org.scada_lts.web.beans.validation.xss.XssValid; +import org.scada_lts.web.beans.validation.xss.XssProtect; public class CssStyle { - @CssValid @XssValid + @CssValid @XssProtect private final String content; @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) diff --git a/test/org/scada_lts/web/security/XssUtilsTestsSuite.java b/test/org/scada_lts/web/security/OwaspXssValidatorTestsSuite.java similarity index 78% rename from test/org/scada_lts/web/security/XssUtilsTestsSuite.java rename to test/org/scada_lts/web/security/OwaspXssValidatorTestsSuite.java index 31f453e33e..ae286f48ba 100644 --- a/test/org/scada_lts/web/security/XssUtilsTestsSuite.java +++ b/test/org/scada_lts/web/security/OwaspXssValidatorTestsSuite.java @@ -5,9 +5,8 @@ @RunWith(Suite.class) @Suite.SuiteClasses({ - XssUtilsTest.class, OwaspXssValidatorTest.class, OwaspXssValidatorExceptionTest.class }) -public class XssUtilsTestsSuite { +public class OwaspXssValidatorTestsSuite { } \ No newline at end of file From a7426fe259321816619df43a15f6af7de71b8f51 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Thu, 26 Sep 2024 15:05:47 +0200 Subject: [PATCH 54/63] #2992 Prevent XSS for body request --- .../validation/xss}/OwaspXssValidatorExceptionTest.java | 4 +--- .../validation/xss}/OwaspXssValidatorTest.java | 4 +--- .../validation/xss}/OwaspXssValidatorTestsSuite.java | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) rename test/org/scada_lts/web/{security => beans/validation/xss}/OwaspXssValidatorExceptionTest.java (95%) rename test/org/scada_lts/web/{security => beans/validation/xss}/OwaspXssValidatorTest.java (89%) rename test/org/scada_lts/web/{security => beans/validation/xss}/OwaspXssValidatorTestsSuite.java (83%) diff --git a/test/org/scada_lts/web/security/OwaspXssValidatorExceptionTest.java b/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorExceptionTest.java similarity index 95% rename from test/org/scada_lts/web/security/OwaspXssValidatorExceptionTest.java rename to test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorExceptionTest.java index 27691bc54e..5439b9978a 100644 --- a/test/org/scada_lts/web/security/OwaspXssValidatorExceptionTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorExceptionTest.java @@ -1,10 +1,8 @@ -package org.scada_lts.web.security; +package org.scada_lts.web.beans.validation.xss; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.scada_lts.web.beans.validation.xss.OwaspXssValidator; -import org.scada_lts.web.beans.validation.xss.XssValidatorException; import java.util.Arrays; import java.util.Collection; diff --git a/test/org/scada_lts/web/security/OwaspXssValidatorTest.java b/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTest.java similarity index 89% rename from test/org/scada_lts/web/security/OwaspXssValidatorTest.java rename to test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTest.java index cc49fdaf30..d90db4f815 100644 --- a/test/org/scada_lts/web/security/OwaspXssValidatorTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTest.java @@ -1,10 +1,8 @@ -package org.scada_lts.web.security; +package org.scada_lts.web.beans.validation.xss; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.scada_lts.web.beans.validation.xss.OwaspXssValidator; -import org.scada_lts.web.beans.validation.xss.XssValidatorException; import java.util.Arrays; import java.util.Collection; diff --git a/test/org/scada_lts/web/security/OwaspXssValidatorTestsSuite.java b/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTestsSuite.java similarity index 83% rename from test/org/scada_lts/web/security/OwaspXssValidatorTestsSuite.java rename to test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTestsSuite.java index ae286f48ba..8cebbf4e86 100644 --- a/test/org/scada_lts/web/security/OwaspXssValidatorTestsSuite.java +++ b/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTestsSuite.java @@ -1,4 +1,4 @@ -package org.scada_lts.web.security; +package org.scada_lts.web.beans.validation.xss; import org.junit.runner.RunWith; import org.junit.runners.Suite; From 4cfdd4e4a8023bba4cf2be6ed588fe2fe05d2de1 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Thu, 26 Sep 2024 16:15:14 +0200 Subject: [PATCH 55/63] #2992 Prevent XSS for body request --- .../web/beans/validation/xss/XssProtect.java | 10 +++------- src/org/scada_lts/web/mvc/api/UserCommentAPI.java | 3 ++- .../xss/OwaspXssValidatorTestsSuite.java | 4 ++-- ...ionTest.java => XssValidatorExceptionTest.java} | 14 ++++++++------ ...XssValidatorTest.java => XssValidatorTest.java} | 13 +++++++------ 5 files changed, 22 insertions(+), 22 deletions(-) rename test/org/scada_lts/web/beans/validation/xss/{OwaspXssValidatorExceptionTest.java => XssValidatorExceptionTest.java} (88%) rename test/org/scada_lts/web/beans/validation/xss/{OwaspXssValidatorTest.java => XssValidatorTest.java} (77%) diff --git a/src/org/scada_lts/web/beans/validation/xss/XssProtect.java b/src/org/scada_lts/web/beans/validation/xss/XssProtect.java index 0f28330e94..c56362c599 100644 --- a/src/org/scada_lts/web/beans/validation/xss/XssProtect.java +++ b/src/org/scada_lts/web/beans/validation/xss/XssProtect.java @@ -2,18 +2,14 @@ import javax.validation.Constraint; import javax.validation.Payload; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; +@Documented @Constraint(validatedBy = XssConstraintValidator.class) -@Target({ ElementType.FIELD, ElementType.PARAMETER }) +@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface XssProtect { String message() default "Potential XSS detected in the request body."; - Class[] groups() default {}; - Class[] payload() default {}; } diff --git a/src/org/scada_lts/web/mvc/api/UserCommentAPI.java b/src/org/scada_lts/web/mvc/api/UserCommentAPI.java index 77dc26d135..5992f4992b 100644 --- a/src/org/scada_lts/web/mvc/api/UserCommentAPI.java +++ b/src/org/scada_lts/web/mvc/api/UserCommentAPI.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; import static org.scada_lts.utils.UserCommentApiUtils.validUserComment; import static org.scada_lts.utils.UserCommentApiUtils.validUserCommentWithTs; @@ -42,7 +43,7 @@ public UserCommentAPI() { * @return Status */ @PostMapping(value = "/{typeId}/{refId}") - public ResponseEntity createUserComment(HttpServletRequest request, @RequestBody CreateUserComment createUserComment, @PathVariable("typeId") Integer typeId, @PathVariable("refId") Integer refId) { + public ResponseEntity createUserComment(HttpServletRequest request, @Valid @RequestBody CreateUserComment createUserComment, @PathVariable("typeId") Integer typeId, @PathVariable("refId") Integer refId) { try { User user = Common.getUser(request); if(user != null) { diff --git a/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTestsSuite.java b/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTestsSuite.java index 8cebbf4e86..2ba2c92313 100644 --- a/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTestsSuite.java +++ b/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTestsSuite.java @@ -5,8 +5,8 @@ @RunWith(Suite.class) @Suite.SuiteClasses({ - OwaspXssValidatorTest.class, - OwaspXssValidatorExceptionTest.class + XssValidatorTest.class, + XssValidatorExceptionTest.class }) public class OwaspXssValidatorTestsSuite { } \ No newline at end of file diff --git a/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorExceptionTest.java b/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java similarity index 88% rename from test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorExceptionTest.java rename to test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java index 5439b9978a..725ca57fcb 100644 --- a/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorExceptionTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java @@ -3,15 +3,16 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.scada_lts.web.beans.validation.css.SacCssValidator; import java.util.Arrays; import java.util.Collection; @RunWith(Parameterized.class) -public class OwaspXssValidatorExceptionTest { +public class XssValidatorExceptionTest { @Parameterized.Parameters - public static Collection testData() { + public static Collection data() { return Arrays.asList(new Object[][]{ {null}, {""}, @@ -55,14 +56,15 @@ public static Collection testData() { } private final String input; - private final OwaspXssValidator owaspXssValidator = new OwaspXssValidator(); + private final OwaspXssValidator validator; - public OwaspXssValidatorExceptionTest(String input) { + public XssValidatorExceptionTest(String input) { this.input = input; + this.validator = new OwaspXssValidator(); } @Test(expected = XssValidatorException.class) - public void testValidateHttpBodyException() throws XssValidatorException { - owaspXssValidator.validate(input); + public void when_isInvalidXss() throws XssValidatorException { + validator.validate(input); } } diff --git a/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTest.java b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java similarity index 77% rename from test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTest.java rename to test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java index d90db4f815..535cb6c788 100644 --- a/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java @@ -8,10 +8,10 @@ import java.util.Collection; @RunWith(Parameterized.class) -public class OwaspXssValidatorTest { +public class XssValidatorTest { @Parameterized.Parameters - public static Collection testData() { + public static Collection data() { return Arrays.asList(new Object[][]{ {"Bold"}, {"Hello, World!"}, @@ -31,14 +31,15 @@ public static Collection testData() { } private final String input; - private final OwaspXssValidator owaspXssValidator = new OwaspXssValidator(); + private final OwaspXssValidator validator; - public OwaspXssValidatorTest(String input) { + public XssValidatorTest(String input) { this.input = input; + this.validator = new OwaspXssValidator(); } @Test - public void testValidateHttpBody() throws XssValidatorException { - owaspXssValidator.validate(input); + public void when_isInvalidXss() throws XssValidatorException { + validator.validate(input); } } From 18f446b460312db2751a3e989ec518b7aff928b4 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Thu, 26 Sep 2024 18:32:29 +0200 Subject: [PATCH 56/63] #2992 Prevent XSS for body request --- build.gradle | 2 +- ...pXssValidatorTestsSuite.java => XssValidatorTestsSuite.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename test/org/scada_lts/web/beans/validation/xss/{OwaspXssValidatorTestsSuite.java => XssValidatorTestsSuite.java} (84%) diff --git a/build.gradle b/build.gradle index ee87c21e61..f05f775ceb 100644 --- a/build.gradle +++ b/build.gradle @@ -244,7 +244,7 @@ test { includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" includeTestsMatching "org.scada_lts.web.mvc.api.validation.css.CssValidatorTestsSuite" includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" - includeTestsMatching "org.scada_lts.web.security.OwaspXssValidatorTestsSuite" + includeTestsMatching "org.scada_lts.web.beans.validation.xss.XssValidatorTestsSuite" } failFast = true diff --git a/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTestsSuite.java b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTestsSuite.java similarity index 84% rename from test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTestsSuite.java rename to test/org/scada_lts/web/beans/validation/xss/XssValidatorTestsSuite.java index 2ba2c92313..70baf1b9e7 100644 --- a/test/org/scada_lts/web/beans/validation/xss/OwaspXssValidatorTestsSuite.java +++ b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTestsSuite.java @@ -8,5 +8,5 @@ XssValidatorTest.class, XssValidatorExceptionTest.class }) -public class OwaspXssValidatorTestsSuite { +public class XssValidatorTestsSuite { } \ No newline at end of file From 41153ffee41232e5031bf4d2ccc388b690857194 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Fri, 27 Sep 2024 10:51:31 +0200 Subject: [PATCH 57/63] #2992 Prevent XSS for body request --- build.gradle | 1 - .../web/beans/validation/xss/XssValidatorExceptionTest.java | 4 ++-- .../scada_lts/web/beans/validation/xss/XssValidatorTest.java | 5 +++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index f05f775ceb..57a107489b 100644 --- a/build.gradle +++ b/build.gradle @@ -241,7 +241,6 @@ test { includeTestsMatching "com.serotonin.mango.util.StartStopDataPointsUtilsTestsSuite" includeTestsMatching "org.scada_lts.utils.BlockingQueuesUtilsTest" includeTestsMatching "org.scada_lts.web.security.XssProtectHtmlEscapeUtilsTest" - includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" includeTestsMatching "org.scada_lts.web.mvc.api.validation.css.CssValidatorTestsSuite" includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" includeTestsMatching "org.scada_lts.web.beans.validation.xss.XssValidatorTestsSuite" diff --git a/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java b/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java index 725ca57fcb..244f5c0dfa 100644 --- a/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java @@ -3,7 +3,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.scada_lts.web.beans.validation.css.SacCssValidator; +import org.scada_lts.web.beans.validation.ScadaValidatorException; import java.util.Arrays; import java.util.Collection; @@ -64,7 +64,7 @@ public XssValidatorExceptionTest(String input) { } @Test(expected = XssValidatorException.class) - public void when_isInvalidXss() throws XssValidatorException { + public void when_isInvalidXss() throws ScadaValidatorException { validator.validate(input); } } diff --git a/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java index 535cb6c788..7dc2f86379 100644 --- a/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.scada_lts.web.beans.validation.ScadaValidatorException; import java.util.Arrays; import java.util.Collection; @@ -26,7 +27,7 @@ public static Collection data() { {"body { font-size: 14px; }"}, {"h1 { font-weight: bold; }"}, {"p { margin: 0; padding: 0; }"}, - {"\"Example"} + {"\"Example"} }); } @@ -39,7 +40,7 @@ public XssValidatorTest(String input) { } @Test - public void when_isInvalidXss() throws XssValidatorException { + public void when_isInvalidXss() throws ScadaValidatorException { validator.validate(input); } } From 4bc71beed26469e278134e6eeeb27926e45deac7 Mon Sep 17 00:00:00 2001 From: Patrykb0802 Date: Fri, 27 Sep 2024 10:57:25 +0200 Subject: [PATCH 58/63] #2992 Prevent XSS for body request --- build.gradle | 2 +- .../scada_lts/web/beans/validation/xss/XssValidatorTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 57a107489b..6f7deb1d66 100644 --- a/build.gradle +++ b/build.gradle @@ -241,8 +241,8 @@ test { includeTestsMatching "com.serotonin.mango.util.StartStopDataPointsUtilsTestsSuite" includeTestsMatching "org.scada_lts.utils.BlockingQueuesUtilsTest" includeTestsMatching "org.scada_lts.web.security.XssProtectHtmlEscapeUtilsTest" - includeTestsMatching "org.scada_lts.web.mvc.api.validation.css.CssValidatorTestsSuite" includeTestsMatching "org.scada_lts.web.security.XssUtilsTest" + includeTestsMatching "org.scada_lts.web.mvc.api.validation.css.CssValidatorTestsSuite" includeTestsMatching "org.scada_lts.web.beans.validation.xss.XssValidatorTestsSuite" } diff --git a/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java index 7dc2f86379..0af1851dc3 100644 --- a/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java @@ -27,7 +27,8 @@ public static Collection data() { {"body { font-size: 14px; }"}, {"h1 { font-weight: bold; }"}, {"p { margin: 0; padding: 0; }"}, - {"\"Example"} + {"\"Example"}, + {"\"Example"} }); } From c7c7eee977f16eb0b29cf4e4fd787843e322d453 Mon Sep 17 00:00:00 2001 From: Kamil Date: Fri, 27 Sep 2024 13:50:00 +0200 Subject: [PATCH 59/63] #2992 Prevent XSS for body request: - corrected xss body validation - use regex; - added tests: BodyXssUtilsTest, XssUtilsTestsSuite; - added cases to tests: XssValidatorExceptionTest, XssValidatorTest; - added properties in env.properties: scadalts.security.http.body.protect.enabled scadalts.security.http.body.access.denied.regex scadalts.security.http.body.access.granted.regex; - refactored XssUtils: added methods: validate, validateHttpBody; --- .../WEB-INF/lib/java10-shim-20240325.1.jar | Bin 3861 -> 0 bytes .../WEB-INF/lib/java8-shim-20240325.1.jar | Bin 11573 -> 0 bytes .../owasp-java-html-sanitizer-20240325.1.jar | Bin 241952 -> 0 bytes build.gradle | 2 +- .../scada_lts/utils/SystemSettingsUtils.java | 32 +++++ .../validation/xss/OwaspXssValidator.java | 34 ----- .../validation/xss/RegexXssValidator.java | 15 ++ .../xss/XssConstraintValidator.java | 2 +- src/org/scada_lts/web/security/XssUtils.java | 29 +++- test/env.properties | 10 +- .../xss/XssValidatorExceptionTest.java | 13 +- .../validation/xss/XssValidatorTest.java | 20 ++- .../web/security/BodyXssUtilsTest.java | 130 ++++++++++++++++++ .../scada_lts/web/security/XssUtilsTest.java | 8 ++ .../web/security/XssUtilsTestsSuite.java | 12 ++ webapp-resources/env.properties | 6 +- 16 files changed, 259 insertions(+), 54 deletions(-) delete mode 100644 WebContent/WEB-INF/lib/java10-shim-20240325.1.jar delete mode 100644 WebContent/WEB-INF/lib/java8-shim-20240325.1.jar delete mode 100644 WebContent/WEB-INF/lib/owasp-java-html-sanitizer-20240325.1.jar delete mode 100644 src/org/scada_lts/web/beans/validation/xss/OwaspXssValidator.java create mode 100644 src/org/scada_lts/web/beans/validation/xss/RegexXssValidator.java create mode 100644 test/org/scada_lts/web/security/BodyXssUtilsTest.java create mode 100644 test/org/scada_lts/web/security/XssUtilsTestsSuite.java diff --git a/WebContent/WEB-INF/lib/java10-shim-20240325.1.jar b/WebContent/WEB-INF/lib/java10-shim-20240325.1.jar deleted file mode 100644 index 59c87d5140955a75196b36dd51da6f38aa6375a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3861 zcmb_e2UL^k5=}r#1nD5efFKA+2~DIc0SPrR)Swh;p)84^gsxO+(!m1K1q&!35=2y_ zNGF6UB1jb$L46`kTtzmKU171jeQ$Si{&T+knLBqf-<+9?GNj$H698ZY03?kAECE{# zL^&gL%wW>`NVp7&;>JaBWBlUw>9cqMit@8D<)OUYbVI<9`fwdnGbjSSh#++s8A?NY zb{R@bkV#z?CbInsh|rT)yP^eGkgpFCKV5dvA}Q__6-Q&)d}v z_g|d9)(2d}7?mC7V1EB*CPZr(0E`x;L$rKlEc0KoolD+0%R8Bnk)uv1P(_5_R<)Ddg% z?OkbsLxa(5ITtSNiqSU$gEJee>~wna^vmT?CfbS;yqC3Rao&^8sXd+A8;9M_FM z7UcxDvc623n}qXn`Xo`t=~m$+{D4iF%MUlwMY{zqS^4J~UiZQ?|g>KvFVP<`Ig$F1L@>30TU_ zg$V8`MPmx2%+0NDVeR#p8A6#3+OI6w%5ddQltl`P_7Y;zIuYaZfm_ z2Mk<-8sw+FRO8Ca{mZJD&I)2&G!SNqyi3CKSX0FN#4kxA^Y6mpv&|B60NeBhx`h(P$j|G}5SF z<7lWpI)c_3?4Y*h9WaK@J5Uj(KB{=!P=5JwFF=7;L+xtNdN?~)6v1*xpFhA<8yy$B z(=f}I0Zc^jeN9OuBY5RqV6Rr%=oQnd<9aA>(J4Q{<<_E$kR=q#>4 z6n|i;B`_}Jh`**B`#sR!*zTCRGLPs+kyzf?0FF3zSv#Gxq8g^`uCPNixIwOo^P~Wd zAdzz-wyEMNl8>Gk*~|y;tHY5aNJ)k_CUVak27x>(gJPIuue^9h?>-=u7ql$Smj#eAs+FNnZ3KxxPy{Ug4};-(xuA3C6~b#pEYE8$gzmNM&Hh3aGD1to&La@TkCe4udAdLM2pLod^`jU*RjX29(YN z6a)b7^C}Ft>637wKK(hG10`@R^@c3n1ocYysg4|Qz|K8)-(=Vbt2|6Ev+KiH*$WWr z9j&b9vxWzFu*1VcFx+m=_e(S4W4RqUYsc+WR;=~l{;4-F&2{Z&&U@**;;61Q7qL9^ zlzI88dx-6{{nPcQpFh!e*zGoeik(gnTWGraTSfd(70MHMk4%fTEPr&lR|Bxtyiya66?D=+pA@Kw^N6g09!X?7W>QQWwT_|buB)!HV z7A8LzZLF=sliPwTRX&d|%w4#_nvk%iKFk%!L%%r$_J$UdRNQdP`MM(c30(9 z&u)=HQ~p<2xcGa9J>kplch7Y%`P|}}am-7tWZs7ydIZ7{Q)0<$V#GT&NRZ8#h?;$= zyhbdcEXl!Mp1&AWZY)4 ze`!y6P*#>d4qIu~kvJ^KHPVIdmb$N?oM8sOnus1DUUt(37tNhIDqG%Wrx}_}JUPZR z7~t0*egB0m`Al|Do~#94dC~Q$!Suzn=Aa6}!mAqSbZ|R3v9hG?#U%#$78SA>sCrPP zTo+$u^{^)4-tnAcZB@}9#Tc<}qURUQyT zAraiF7bX~^ra69{{UE%Ii1maaAs|z$5x!OuAF9;cCIJCT|vlfqksnluBL)<}pU9s};84GbZ1uDiRj)Odm-&L|m*& zGq&=BF_w}J7f!-J7n}!c7%P_Uz7U#W)N0C<(#}5=SyPMaA2K8cA9OH-nuI#A$M+R!u$3+Y>k) zGUYkdsKy0ZU2VRG=P%-wUY6Kh18TBG83JjzXuq#Dsj_*)*Z^-})YDgyxB=S~TH9sx zA2>i^nAld>7E%2(VyX<@Fe-5o<+ve=f1D~+7H=38(Lp&<5r2y0ALFPpdBdoRar5@K%j`cn z3&ZFrV|!agzc0GCH`MmUw;8gTvIVw<+`0z02KwIe*bLOc@Xdw&?V4|`#viL>EAjW{ k!6vaMrCYak%KuHgIUP`jbd<^f0L+w6J1qd9$VC12JNqGcLI3~& diff --git a/WebContent/WEB-INF/lib/java8-shim-20240325.1.jar b/WebContent/WEB-INF/lib/java8-shim-20240325.1.jar deleted file mode 100644 index d2e2bac67c626cd6bd75f86463fd6489027d2d49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11573 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≪)UQuTyc#wD>o)abDZ$G|Ve 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گ_&d$Q{_@)g%r(eC6>RzfF1 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

    %avVUg=MDQ9%6z2_;1h(ivna=&--FX~>E2&(@M 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


    ;4g%F=ze<6#ESmJYx| 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

    +g_Bz57$rGi^;41Y|1>B;J9B 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 { - - private final PolicyFactory policyFactory; - - public OwaspXssValidator() { - PolicyFactory basePolicy = Sanitizers.FORMATTING - .and(Sanitizers.LINKS) - .and(Sanitizers.STYLES) - .and(Sanitizers.IMAGES); - - this.policyFactory = new HtmlPolicyBuilder() - .allowCommonInlineFormattingElements() - .allowCommonBlockElements() - .allowStandardUrlProtocols() - .allowStyling() - .toFactory() - .and(basePolicy); - } - - @Override - public void validate(String input) throws XssValidatorException { - String sanitized = policyFactory.sanitize(input); - if (!sanitized.equals(input)) { - throw new XssValidatorException("Potential XSS attack detected"); - } - } -} diff --git a/src/org/scada_lts/web/beans/validation/xss/RegexXssValidator.java b/src/org/scada_lts/web/beans/validation/xss/RegexXssValidator.java new file mode 100644 index 0000000000..04dde17abc --- /dev/null +++ b/src/org/scada_lts/web/beans/validation/xss/RegexXssValidator.java @@ -0,0 +1,15 @@ +package org.scada_lts.web.beans.validation.xss; + +import org.scada_lts.web.beans.validation.ScadaValidator; + +import static org.scada_lts.web.security.XssUtils.validateHttpBody; + +public class RegexXssValidator implements ScadaValidator { + + @Override + public void validate(String input) throws XssValidatorException { + if(!validateHttpBody(input)) { + throw new XssValidatorException("Potential XSS attack detected"); + } + } +} diff --git a/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java b/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java index 772ffe8077..d2e3f029ff 100644 --- a/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java +++ b/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java @@ -15,7 +15,7 @@ public void beforeValidate(String value) throws Exception { @Override public void validate(String value) throws Exception { - ScadaValidator validator = new OwaspXssValidator(); + ScadaValidator validator = new RegexXssValidator(); validator.validate(value); } } diff --git a/src/org/scada_lts/web/security/XssUtils.java b/src/org/scada_lts/web/security/XssUtils.java index c92f42392a..71b1339ac2 100644 --- a/src/org/scada_lts/web/security/XssUtils.java +++ b/src/org/scada_lts/web/security/XssUtils.java @@ -3,6 +3,7 @@ import org.scada_lts.serorepl.utils.StringUtils; import org.scada_lts.utils.SystemSettingsUtils; +import java.util.function.Predicate; import java.util.regex.Pattern; public final class XssUtils { @@ -14,24 +15,42 @@ private XssUtils() {} public static final int SECURITY_HTTP_ACCESS_GRANTED_QUERY_LIMIT = SystemSettingsUtils.getSecurityHttpQueryLimit(); public static final boolean SECURITY_HTTP_QUERY_PROTECT_ENABLED = SystemSettingsUtils.isSecurityHttpQueryProtectEnabled(); + private static final Pattern SECURITY_HTTP_ACCESS_DENIED_BODY_REGEX = init(SystemSettingsUtils.getSecurityHttpBodyAccessDeniedRegex()); + private static final Pattern SECURITY_HTTP_ACCESS_GRANTED_BODY_REGEX = init(SystemSettingsUtils.getSecurityHttpBodyAccessGrantedRegex()); + public static final boolean SECURITY_HTTP_BODY_PROTECT_ENABLED = SystemSettingsUtils.isSecurityHttpBodyProtectEnabled(); + public static boolean validateHttpQuery(String query) { + return validate(query, SECURITY_HTTP_QUERY_PROTECT_ENABLED, q -> q.length() > SECURITY_HTTP_ACCESS_GRANTED_QUERY_LIMIT, + SECURITY_HTTP_ACCESS_DENIED_QUERY_REGEX, SECURITY_HTTP_ACCESS_GRANTED_QUERY_REGEX); + + } + + public static boolean validateHttpBody(String body) { + return validate(body, SECURITY_HTTP_BODY_PROTECT_ENABLED, b -> false, SECURITY_HTTP_ACCESS_DENIED_BODY_REGEX, + SECURITY_HTTP_ACCESS_GRANTED_BODY_REGEX); + } - if(!SECURITY_HTTP_QUERY_PROTECT_ENABLED) + private static boolean validate(String input, + boolean protectEnabled, + Predicate beforeCheckRegex, + Pattern accessDeniedRegex, + Pattern accessGrantedRegex) { + if(!protectEnabled) return true; - if (query == null || query.isEmpty()) { + if (input == null || input.isEmpty()) { return false; } - if(query.length() > SECURITY_HTTP_ACCESS_GRANTED_QUERY_LIMIT) { + if(beforeCheckRegex.test(input)) { return false; } - if(SECURITY_HTTP_ACCESS_DENIED_QUERY_REGEX != null && SECURITY_HTTP_ACCESS_DENIED_QUERY_REGEX.matcher(query).matches()) { + if(accessDeniedRegex != null && accessDeniedRegex.matcher(input).matches()) { return false; } - return SECURITY_HTTP_ACCESS_GRANTED_QUERY_REGEX == null || SECURITY_HTTP_ACCESS_GRANTED_QUERY_REGEX.matcher(query).matches(); + return accessGrantedRegex == null || accessGrantedRegex.matcher(input).matches(); } private static Pattern init(String regex) { diff --git a/test/env.properties b/test/env.properties index be695d0277..4decd87fad 100644 --- a/test/env.properties +++ b/test/env.properties @@ -190,6 +190,12 @@ http.protocol.timeout-ms=15000 event.assign.enabled=true scadalts.security.http.query.protect.enabled=true -scadalts.security.http.query.limit=3900 +scadalts.security.http.query.limit=137 scadalts.security.http.query.access.denied.regex=^(.*?(javascript:|onerror|onload|onmouseover|alert\\(){1}.*?)$ -scadalts.security.http.query.access.granted.regex=^(([a-zA-Z0-9_\\-]{1,32}=[a-zA-Z0-9_\\-.,/+=\s!$*?@%]*&?)|([a-zA-Z0-9_\\-]{1,32}&?))+$ \ No newline at end of file +scadalts.security.http.query.access.granted.regex=^(([a-zA-Z0-9_\\-]{1,32}=[a-zA-Z0-9_\\-.,/+=\s!$*?@%]*&?)|([a-zA-Z0-9_\\-]{1,32}&?))+$ + +systemsettings.custom.css.content=#top-description-container {\n\r\t\t\t\tdisplay: flex;\n\r\t\t\t\talign-items: flex-end;\n\r\t\t\t\tjustify-content: center;\n\r} \n\r\n\r#top-description-prefix { \n\r\t\t\t\tcolor: black !important;\n\r\t\t\t\tfont-size: 2em !important;\n\r\t\t\t\tmargin-left: 0.5em !important;\n\r\t\t\t\tmargin-right: 0.5em !important;\n\r\t\t\t\tdisplay: inline-block !important;\n\r\t\t\t\tvertical-align: bottom !important;\n\r\t\t\t\tline-height: 1 !important;\n\r} \n\r\n\r#top-description {\n\r\t\t\t\tcolor: #39B54A !important;\n\r\t\t\t\tfont-size: 2em !important;\n\r\t\t\t\tdisplay: inline-block !important;\n\r\t\t\t\tline-height: 1 !important;\n\r} + +scadalts.security.http.body.protect.enabled=true +scadalts.security.http.body.access.denied.regex=^(.*?((expression\\s*\\()|url\\s*\\(\\s*['\"]?javascript:|url\\s*\\(\\s*['\"]?data:|]*>||]+onerror=|@import\\s+url\\s*\\(\\s*['\"]?javascript:|]*>|]*>|<[^>]+>onerror\\s*=|onload\\s*=|eval\\s*\\(|alert\\s*\\(|onerror\\s*=|document.location){1}.*?)$ +scadalts.security.http.body.access.granted.regex=^.* \ No newline at end of file diff --git a/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java b/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java index 244f5c0dfa..c3c51f8056 100644 --- a/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.scada_lts.web.beans.validation.ScadaValidator; import org.scada_lts.web.beans.validation.ScadaValidatorException; import java.util.Arrays; @@ -11,10 +12,11 @@ @RunWith(Parameterized.class) public class XssValidatorExceptionTest { - @Parameterized.Parameters + @Parameterized.Parameters(name = "{index}: input: {0}") public static Collection data() { return Arrays.asList(new Object[][]{ {null}, + {""}, {""}, {"Link"}, {"

    Click me
    "}, @@ -51,16 +53,19 @@ public static Collection data() { {""}, {"XSS"}, {""}, - {"Click me"} + {"Click me"}, + {"\"Example"}, + {"\"Example"}, + {">"}, }); } private final String input; - private final OwaspXssValidator validator; + private final ScadaValidator validator; public XssValidatorExceptionTest(String input) { this.input = input; - this.validator = new OwaspXssValidator(); + this.validator = new RegexXssValidator(); } @Test(expected = XssValidatorException.class) diff --git a/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java index 0af1851dc3..6ec372b04f 100644 --- a/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.scada_lts.web.beans.validation.ScadaValidator; import org.scada_lts.web.beans.validation.ScadaValidatorException; import java.util.Arrays; @@ -11,12 +12,11 @@ @RunWith(Parameterized.class) public class XssValidatorTest { - @Parameterized.Parameters + @Parameterized.Parameters(name = "{index}: input: {0}") public static Collection data() { return Arrays.asList(new Object[][]{ {"Bold"}, {"Hello, World!"}, - {""}, {"Italic text"}, {"Underlined"}, {"Strong text"}, @@ -27,17 +27,25 @@ public static Collection data() { {"body { font-size: 14px; }"}, {"h1 { font-weight: bold; }"}, {"p { margin: 0; padding: 0; }"}, - {"\"Example"}, - {"\"Example"} + {"a > 12"}, + {"a>12"}, + {"a> 12"}, + {"a >12"}, + {"a<12"}, + {"a < 12"}, + {"a< 12"}, + {"a <12"}, + {"'a'"}, + {"\"a\""}, }); } private final String input; - private final OwaspXssValidator validator; + private final ScadaValidator validator; public XssValidatorTest(String input) { this.input = input; - this.validator = new OwaspXssValidator(); + this.validator = new RegexXssValidator(); } @Test diff --git a/test/org/scada_lts/web/security/BodyXssUtilsTest.java b/test/org/scada_lts/web/security/BodyXssUtilsTest.java new file mode 100644 index 0000000000..d789484334 --- /dev/null +++ b/test/org/scada_lts/web/security/BodyXssUtilsTest.java @@ -0,0 +1,130 @@ +package org.scada_lts.web.security; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import java.util.Arrays; +import java.util.Collection; + +import static org.junit.Assert.assertEquals; + +@RunWith(Parameterized.class) +public class BodyXssUtilsTest { + + private final String input; + private final boolean expectedResult; + + public BodyXssUtilsTest(String input, boolean expectedResult) { + this.input = input; + this.expectedResult = expectedResult; + } + + @Parameters(name = "{index}: input: {0}, expectedResult: {1}") + public static Collection data() { + return Arrays.asList(new Object[][]{ + + // Test for a legitimate Query + {"validUser", true}, + {"123", true}, + + // Tests for queries containing banned patterns. + {"javascript:alert(1)", false}, + {"onerror=alert(1)", false}, + {"", false}, + {"onload=alert(1)", false}, + {"onmouseover=alert(1)", false}, + {"%6A%61%76%61%73%63%72%69%70%74", true}, + + // Borderline cases + {"=&", true}, + {"a”.repeat(33)", true}, + {"invalid!key", true}, + {"validKey", true}, + {"onerror=alert(1)&onload=alert(1)", false}, + {"!key=value", true}, + + + {"abc", true}, + {"ABC", true}, + {"abc=abc", true}, + {"ABC=ABC", true}, + {"abc=abc&ABC=ABC", true}, + {"ABC=ABC&abc=abc", true}, + {"abc=1", true}, + {"ABC=1", true}, + {"param123", true}, + {"param1¶m2=23", true}, + {"param1=12¶m2", true}, + {"param1=12¶m2¶m3", true}, + {"param1", true}, + {"startTs=123", true}, + {"startTs=1724326168402&endTs=1724329768507", true}, + {"startTs=123.", true}, + {"startTs=12345678901234567890123456789012", true}, + {"startTs=123456789012345678901234567890123", true}, + {"12345678901234567890123456789012=abc", true}, + {"123456789012345678901234567890123=abc", true}, + {"startTs=1724326168402&endTs=1724329768507&ids=101,70,97,84&configFromSystem=false&enabled=false&valuesLimit=10000&limitFactor=1", true}, + {"projectName=sagadf&includePointValues=true&includeUploadsFolder=true&includeGraphicsFolder=true&projectDescription=&pointValuesMaxZip=100", true}, + {"projectName=sagadf&includePointValues=true&includeUploadsFolder=true&includeGraphicsFolder=true&projectDescription=&pointValuesMaxZip=1005", true}, + {"projectName=sagadf&includePointValues=true&includeUploadsFolder=true&includeGraphicsFolder=true&projectDescription=&pointValuesMaxZip=100&abc=12", true}, + {"abc=", true}, + + {"", false}, + {null, false}, + {"¶m1", true}, + {"¶m1¶m2", true}, + {"¶m1=123¶m2", true}, + {"¶m1¶m=123", true}, + {"param1¶m2=23&onerror", true}, + {"param1¶m2=23onerror", true}, + {"param1¶m2=23&onerror=", false}, + {"param1¶m2=23onerror=", false}, + {"para!m1", true}, + {"onerror=alert(1)", false}, + {"onload=alert(1)", false}, + {"onerror=abc", false}, + {"onload=abc", false}, + {"onload=", false}, + {"onerror=", false}, + {"onload =", false}, + {"onerror =", false}, + {"onload =", false}, + {"onerror =", false}, + {"onload", true}, + {"onerror", true}, + {"!param1=value", true}, + {"", false}, + {"param1=", false}, + {"param1=¶m2=123", false}, + {"param1=123¶m2=", false}, + {"param1=123¶m2=", false}, + {"param1=alert(document.location)", false}, + {"=abc", true}, + {"param1=", false}, + {"param1=alert(document.location)/script>", false}, + {"param1=alert(document.location)document.location", false}, + {"param1=document.location", false}, + {"param1=document.location", false}, + {"param1=document.location/script>", false}, + {"param1=document.location data() { {"123456789012345678901234567890123=abc", true}, {"startTs=1724326168402&endTs=1724329768507&ids=101,70,97,84&configFromSystem=false&enabled=false&valuesLimit=10000&limitFactor=1", true}, {"projectName=sagadf&includePointValues=true&includeUploadsFolder=true&includeGraphicsFolder=true&projectDescription=&pointValuesMaxZip=100", true}, + {"projectName=sagadf&includePointValues=true&includeUploadsFolder=true&includeGraphicsFolder=true&projectDescription=&pointValuesMaxZip=1005", false}, + {"projectName=sagadf&includePointValues=true&includeUploadsFolder=true&includeGraphicsFolder=true&projectDescription=&pointValuesMaxZip=100&abc=12", false}, {"abc=", true}, {"", false}, @@ -78,6 +80,8 @@ public static Collection data() { {"¶m1¶m=123", false}, {"param1¶m2=23&onerror", false}, {"param1¶m2=23onerror", false}, + {"param1¶m2=23&onerror=", false}, + {"param1¶m2=23onerror=", false}, {"para!m1", false}, {"onerror=alert(1)", false}, {"onload=alert(1)", false}, @@ -85,6 +89,10 @@ public static Collection data() { {"onload=abc", false}, {"onload=", false}, {"onerror=", false}, + {"onload =", false}, + {"onerror =", false}, + {"onload =", false}, + {"onerror =", false}, {"onload", false}, {"onerror", false}, {"!param1=value", false}, diff --git a/test/org/scada_lts/web/security/XssUtilsTestsSuite.java b/test/org/scada_lts/web/security/XssUtilsTestsSuite.java new file mode 100644 index 0000000000..aba3d12ed0 --- /dev/null +++ b/test/org/scada_lts/web/security/XssUtilsTestsSuite.java @@ -0,0 +1,12 @@ +package org.scada_lts.web.security; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ + XssUtilsTest.class, + BodyXssUtilsTest.class +}) +public class XssUtilsTestsSuite { +} \ No newline at end of file diff --git a/webapp-resources/env.properties b/webapp-resources/env.properties index 00c3f7ed82..3126ce359f 100644 --- a/webapp-resources/env.properties +++ b/webapp-resources/env.properties @@ -192,4 +192,8 @@ scadalts.security.http.query.limit=3900 scadalts.security.http.query.access.denied.regex=^(.*?(script>||]*>||]+onerror=|@import\\s+url\\s*\\(\\s*['\"]?javascript:|]*>|]*>|<[^>]+>onerror\\s*=|onload\\s*=|eval\\s*\\(|alert\\s*\\(|onerror\\s*=|document.location){1}.*?)$ +scadalts.security.http.body.access.granted.regex=^.* \ No newline at end of file From a73b109e4884be3a2010a1e5306894a5e3c787e5 Mon Sep 17 00:00:00 2001 From: Kamil Date: Fri, 27 Sep 2024 14:07:08 +0200 Subject: [PATCH 60/63] #2992 Prevent XSS for body request: - corrected name for class XssValidator; --- .../web/beans/validation/xss/XssConstraintValidator.java | 2 +- .../xss/{RegexXssValidator.java => XssValidator.java} | 2 +- .../web/beans/validation/xss/XssValidatorExceptionTest.java | 2 +- .../scada_lts/web/beans/validation/xss/XssValidatorTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename src/org/scada_lts/web/beans/validation/xss/{RegexXssValidator.java => XssValidator.java} (85%) diff --git a/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java b/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java index d2e3f029ff..ce10693918 100644 --- a/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java +++ b/src/org/scada_lts/web/beans/validation/xss/XssConstraintValidator.java @@ -15,7 +15,7 @@ public void beforeValidate(String value) throws Exception { @Override public void validate(String value) throws Exception { - ScadaValidator validator = new RegexXssValidator(); + ScadaValidator validator = new XssValidator(); validator.validate(value); } } diff --git a/src/org/scada_lts/web/beans/validation/xss/RegexXssValidator.java b/src/org/scada_lts/web/beans/validation/xss/XssValidator.java similarity index 85% rename from src/org/scada_lts/web/beans/validation/xss/RegexXssValidator.java rename to src/org/scada_lts/web/beans/validation/xss/XssValidator.java index 04dde17abc..9ab196479c 100644 --- a/src/org/scada_lts/web/beans/validation/xss/RegexXssValidator.java +++ b/src/org/scada_lts/web/beans/validation/xss/XssValidator.java @@ -4,7 +4,7 @@ import static org.scada_lts.web.security.XssUtils.validateHttpBody; -public class RegexXssValidator implements ScadaValidator { +public class XssValidator implements ScadaValidator { @Override public void validate(String input) throws XssValidatorException { diff --git a/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java b/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java index c3c51f8056..6a4d8a3651 100644 --- a/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/XssValidatorExceptionTest.java @@ -65,7 +65,7 @@ public static Collection data() { public XssValidatorExceptionTest(String input) { this.input = input; - this.validator = new RegexXssValidator(); + this.validator = new XssValidator(); } @Test(expected = XssValidatorException.class) diff --git a/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java index 6ec372b04f..1eb7857a59 100644 --- a/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java +++ b/test/org/scada_lts/web/beans/validation/xss/XssValidatorTest.java @@ -45,7 +45,7 @@ public static Collection data() { public XssValidatorTest(String input) { this.input = input; - this.validator = new RegexXssValidator(); + this.validator = new XssValidator(); } @Test From 8b203a5c7bb6fa1b49f28cdb4cdbb28d0189201b Mon Sep 17 00:00:00 2001 From: Kamil Date: Fri, 27 Sep 2024 14:33:51 +0200 Subject: [PATCH 61/63] #2992 Prevent XSS for body request: - corrected systemSettings.jsp; --- WebContent/WEB-INF/jsp/systemSettings.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WebContent/WEB-INF/jsp/systemSettings.jsp b/WebContent/WEB-INF/jsp/systemSettings.jsp index c8e12ff945..e672a1e3ee 100644 --- a/WebContent/WEB-INF/jsp/systemSettings.jsp +++ b/WebContent/WEB-INF/jsp/systemSettings.jsp @@ -1151,7 +1151,7 @@ id="cssEditor" class="hgl-editor" spellcheck="false" - oninput="updateCodeTextEscaped(this.value, '#cssHighlightingContent');" + oninput="updateCodeText(this.value, '#cssHighlightingContent');" onscroll="syncCodeScroll(this, '#cssHighlightingContent');">

    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