//****************************************************************************************************** // OutOfRangeService.cs - Gbtc // // Copyright © 2012, Grid Protection Alliance. All Rights Reserved. // // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See // the NOTICE file distributed with this work for additional information regarding copyright ownership. // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may // not use this file except in compliance with the License. You may obtain a copy of the License at: // // http://www.opensource.org/licenses/MIT // // Unless agreed to in writing, the subject software distributed under the License is distributed on an // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the // License for the specific language governing permissions and limitations. // // Code Modification History: // ---------------------------------------------------------------------------------------------------- // 12/16/2009 - Stephen C. Wills // Generated original version of source code. // 11/07/2010 - Pinal C. Patel // Modified to fix breaking changes made to SelfHostingService. // 12/13/2012 - Starlynn Danyelle Gilliam // Modified Header. // //****************************************************************************************************** using System; using System.Collections.Generic; using System.ServiceModel; using GSF; using GSF.ServiceModel; using GSF.TimeSeries; namespace DataQualityMonitoring.Services { /// /// Represents a REST web service for out-of-range measurements. /// [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] public class OutOfRangeService : SelfHostingService, IOutOfRangeService { #region [ Members ] // Fields private readonly Dictionary m_tests; #endregion #region [ Constructors ] /// /// Initializes a new instance of the class. /// public OutOfRangeService() { m_tests = new Dictionary(); PublishMetadata = true; PersistSettings = true; Endpoints = "http.rest://localhost:6101/rangetest"; } #endregion #region [ Properties ] /// /// Gets the collection of s that have registered with the service. /// public ICollection Tests { get { return m_tests.Values; } } #endregion #region [ Methods ] /// /// Reads all out-of-range measurements from the and sends it in format. /// /// A object. public SerializableRangeTestCollection ReadAllOutOfRangeMeasurementsAsXml() { return ReadOutOfRangeMeasurements(); } /// /// Reads all out-of-range measurements from the and sends it in format. /// /// A object. public SerializableRangeTestCollection ReadAllOutOfRangeMeasurementsAsJson() { return ReadOutOfRangeMeasurements(); } /// /// Reads all out-of-range measurements with the specified signal type and sends it in format. /// /// The signal type of the desired out-of-range measurements. /// A object. public SerializableRangeTestCollection ReadOutOfRangeMeasurementsWithSignalTypeAsXml(string signalType) { return ReadOutOfRangeMeasurementsWithSignalType(signalType); } /// /// Reads all out-of-range measurements with the specified signal type and sends it in format. /// /// The signal type of the desired out-of-range measurements. /// A object. public SerializableRangeTestCollection ReadOutOfRangeMeasurementsWithSignalTypeAsJson(string signalType) { return ReadOutOfRangeMeasurementsWithSignalType(signalType); } /// /// Reads all out-of-range measurements from the specified device and sends it in format. /// /// The name of the device to check for out-of-range measurements. /// A object. public SerializableRangeTestCollection ReadOutOfRangeMeasurementsFromDeviceAsXml(string device) { return ReadOutOfRangeMeasurementsFromDevice(device); } /// /// Reads all out-of-range measurements from the specified device and sends it in format. /// /// The name of the device to check for out-of-range measurements. /// A object. public SerializableRangeTestCollection ReadOutOfRangeMeasurementsFromDeviceAsJson(string device) { return ReadOutOfRangeMeasurementsFromDevice(device); } /// /// Reads all out-of-range measurements from the specified and sends it in format. /// /// The name of the to check for out-of-range measurements. /// A object. public SerializableRangeTestCollection ReadOutOfRangeMeasurementsFromTestAsXml(string test) { return ReadOutOfRangeMeasurementsFromTest(test); } /// /// Reads all out-of-range measurements from the specified and sends it in format. /// /// The name of the to check for out-of-range measurements. /// A object. public SerializableRangeTestCollection ReadOutOfRangeMeasurementsFromTestAsJson(string test) { return ReadOutOfRangeMeasurementsFromTest(test); } /// /// Attaches a to this . /// /// The to be attached to this . public void AttachRangeTest(RangeTest test) { m_tests[test.Name] = test; } /// /// Detaches a from this . /// /// The to be detached from this . public void DetachRangeTest(RangeTest test) { m_tests.Remove(test.Name); } private SerializableRangeTestCollection ReadOutOfRangeMeasurements() { SerializableRangeTestCollection serializableCollection = new SerializableRangeTestCollection(); List serializableTests = new List(); // Convert RangeTests to SerializableRangeTests and add them to the list of serializable tests. foreach (RangeTest test in m_tests.Values) { SerializableRangeTest serializableTest = new SerializableRangeTest(test.Name); List serializableMeasurements = new List(); ICollection outOfRangeMeasurements = test.GetOutOfRangeMeasurements(); // Convert IMeasurements to SerializableOutOfRangeMeasurements and add them to the list of serializable measurements. foreach (IMeasurement measurement in outOfRangeMeasurements) { SerializableOutOfRangeMeasurement serializableMeasurement = CreateSerializableOutOfRangeMeasurement(test, measurement); serializableMeasurements.Add(serializableMeasurement); } serializableTest.OutOfRangeMeasurements = serializableMeasurements.ToArray(); serializableTests.Add(serializableTest); } serializableCollection.RangeTests = serializableTests.ToArray(); return serializableCollection; } private SerializableRangeTestCollection ReadOutOfRangeMeasurementsWithSignalType(string signalType) { SerializableRangeTestCollection serializableCollection = new SerializableRangeTestCollection(); List serializableTests = new List(); // Convert RangeTests to SerializableRangeTests and add them to the list of serializable tests. foreach (RangeTest test in m_tests.Values) { SerializableRangeTest serializableTest = new SerializableRangeTest(test.Name); List serializableMeasurements = new List(); ICollection outOfRangeMeasurements = test.GetOutOfRangeMeasurements(); // Convert IMeasurements to SerializableOutOfRangeMeasurements and add them to the list of serializable measurements. foreach (IMeasurement measurement in outOfRangeMeasurements) { SerializableOutOfRangeMeasurement serializableMeasurement = CreateSerializableOutOfRangeMeasurement(test, measurement); if (serializableMeasurement.SignalType == signalType) serializableMeasurements.Add(serializableMeasurement); } serializableTest.OutOfRangeMeasurements = serializableMeasurements.ToArray(); serializableTests.Add(serializableTest); } serializableCollection.RangeTests = serializableTests.ToArray(); return serializableCollection; } private SerializableRangeTestCollection ReadOutOfRangeMeasurementsFromDevice(string device) { SerializableRangeTestCollection serializableCollection = new SerializableRangeTestCollection(); List serializableTests = new List(); // Convert RangeTests to SerializableRangeTests and add them to the list of serializable tests. foreach (RangeTest test in m_tests.Values) { SerializableRangeTest serializableTest = new SerializableRangeTest(test.Name); List serializableMeasurements = new List(); ICollection outOfRangeMeasurements = test.GetOutOfRangeMeasurements(); // Convert IMeasurements to SerializableOutOfRangeMeasurements and add them to the list of serializable measurements. foreach (IMeasurement measurement in outOfRangeMeasurements) { SerializableOutOfRangeMeasurement serializableMeasurement = CreateSerializableOutOfRangeMeasurement(test, measurement); if(serializableMeasurement.Device == device) serializableMeasurements.Add(serializableMeasurement); } serializableTest.OutOfRangeMeasurements = serializableMeasurements.ToArray(); serializableTests.Add(serializableTest); } serializableCollection.RangeTests = serializableTests.ToArray(); return serializableCollection; } private SerializableRangeTestCollection ReadOutOfRangeMeasurementsFromTest(string acronym) { SerializableRangeTestCollection serializableCollection = new SerializableRangeTestCollection(); List serializableTests = new List(); RangeTest test = m_tests[acronym]; // Convert RangeTest to SerializableRangeTest and add it to the list of serializable tests. SerializableRangeTest serializableTest = new SerializableRangeTest(test.Name); List serializableMeasurements = new List(); ICollection outOfRangeMeasurements = test.GetOutOfRangeMeasurements(); // Convert IMeasurements to SerializableOutOfRangeMeasurements and add them to the list of serializable measurements. foreach (IMeasurement measurement in outOfRangeMeasurements) { SerializableOutOfRangeMeasurement serializableMeasurement = CreateSerializableOutOfRangeMeasurement(test, measurement); serializableMeasurements.Add(serializableMeasurement); } serializableTest.OutOfRangeMeasurements = serializableMeasurements.ToArray(); serializableTests.Add(serializableTest); serializableCollection.RangeTests = serializableTests.ToArray(); return serializableCollection; } private SerializableOutOfRangeMeasurement CreateSerializableOutOfRangeMeasurement(RangeTest test, IMeasurement measurement) { SerializableOutOfRangeMeasurement serializableMeasurement = new SerializableOutOfRangeMeasurement(measurement, test.LowRange, test.HighRange); serializableMeasurement.ProcessException += serializableMeasurement_ProcessException; serializableMeasurement.SetDeviceAndSignalType(test.DataSource); return serializableMeasurement; } // Exceptions from out-of-range measurements get forwarded to the ServiceProcessException event. private void serializableMeasurement_ProcessException(object sender, EventArgs e) { OnServiceProcessException(e.Argument); } #endregion } }