//******************************************************************************************************
// 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
}
}