private void SaveSelectedSignalModel()
{
HourGlass.Start();
try
{
SignalDAO dao = DataManager.getSignalDAO();
if (_signalModelLibrary != null)
{
dao.DeleteTSFLibrary( _signalModelLibrary.TSFLibrary.uuid,
_signalModelLibrary.TSFLibrary.targetNamespace );
var library = new dbTSFLibrary();
library.IncludeKeyOnInsert = true;
library.lastUpdate = DateTime.UtcNow;
library.id = Guid.Parse( _signalModelLibrary.TSFLibrary.uuid );
library.content = _signalModelLibrary.XmlContent;
library.targetNamespace = _signalModelLibrary.TSFLibrary.targetNamespace;
library.libraryName = _signalModelLibrary.TSFLibrary.name;
library.DataState = ( !dao.hasTSFLibrary( _signalModelLibrary.TSFLibrary.uuid ) )
? BASEBean.eDataState.DS_ADD
: BASEBean.eDataState.DS_EDIT;
library.save();
foreach (SignalModel sm in _signalModelLibrary.SignalModels.Values)
{
TSFType tsf = sm.TSF;
dbSignal dataSignal = dao.getSignal( sm.Name, library.targetNamespace );
if (dataSignal == null)
{
//Add Signal to the database
string baseSignalName = sm.BaseSignalName;
dbSignal baseSignal = dao.getSignal( baseSignalName, sm.BaseSignalNameSpace );
dataSignal = new dbSignal();
dataSignal.ParentSignal = baseSignal;
dataSignal.signalName = sm.Name;
dataSignal.uuid = Guid.Parse(tsf.uuid);
dataSignal.xmlns = library.targetNamespace;
foreach (SignalAttribute attribute in sm.Attributes)
{
var a = new dbSignalAttribute();
a.attributeName = attribute.Name;
a.defaultValue = attribute.DefaultValue;
a.DataState = BASEBean.eDataState.DS_ADD;
a.type = attribute.SchemaType;
a.fixedValue = attribute.FixedValue;
if (dataSignal.Attributes == null )
dataSignal.Attributes = new List<dbSignalAttribute>();
dataSignal.Attributes.Add( a );
}
dataSignal.DataState = BASEBean.eDataState.DS_ADD;
}
else
{
dataSignal.xmlns = library.targetNamespace;
dataSignal.uuid = Guid.Parse(tsf.uuid);
List<dbSignalAttribute> attributes = dataSignal.Attributes;
var attrMap = new Dictionary<string, SignalAttribute>();
var dbAttrMap = new Dictionary<string, dbSignalAttribute>();
foreach (SignalAttribute sa in sm.Attributes)
attrMap.Add( sa.Name, sa );
foreach (dbSignalAttribute dbAttribute in attributes)
{
string an = dbAttribute.attributeName;
dbAttrMap.Add( an, dbAttribute );
if (attrMap.ContainsKey( an ))
{
SignalAttribute sa = attrMap[an];
dbAttribute.type = sa.SchemaType;
dbAttribute.defaultValue = sa.DefaultValue;
dbAttribute.fixedValue = sa.FixedValue;
dbAttribute.DataState = BASEBean.eDataState.DS_EDIT;
}
else
{
dbAttribute.DataState = BASEBean.eDataState.DS_DELETE;
}
}
foreach (SignalAttribute sa in sm.Attributes)
{
if (!dbAttrMap.ContainsKey( sa.Name ))
{
var dbAttribute = new dbSignalAttribute();
dbAttribute.type = sa.SchemaType;
dbAttribute.defaultValue = sa.DefaultValue;
dbAttribute.fixedValue = sa.FixedValue;
dbAttribute.DataState = BASEBean.eDataState.DS_ADD;
dataSignal.Attributes.Add( dbAttribute );
}
}
dataSignal.DataState = BASEBean.eDataState.DS_EDIT;
}
dataSignal.xmlns = _signalModelLibrary.TSFLibrary.targetNamespace;
dataSignal.save();
}
foreach (ListViewItem item in lvSignals.Items)
{
var model = item.Tag as SignalModel;
if (model != null)
{
var signal = new dbTSFSignal();
signal.signalName = model.Name;
signal.id = Guid.Parse( model.TSF.uuid );
signal.signalContent = model.TSF.Serialize();
signal.libraryUuid = _signalModelLibrary.TSFLibrary.uuid;
signal.DataState = ( !dao.hasTSFSignal( model.TSF.uuid )
? BASEBean.eDataState.DS_ADD
: BASEBean.eDataState.DS_EDIT );
signal.lastUpdate = DateTime.UtcNow;
try
{
signal.save();
}
catch (Exception e)
{
if (e.Message.ToLower().Contains( "duplicate" ))
{
TestSignalBean otherSignal = dao.getTSFSignal( model.Name,
_signalModelLibrary.TSFLibrary.uuid );
LogManager.Error( "UUID Conflict between document data and the database for Signal {0} in Signal Library {1} ",
model.Name, library.libraryName );
if (otherSignal != null)
{
LogManager.Error( "\tDocument signal uuid {0}, Database signal uuid {{{1}}} ",
model.TSF.uuid, otherSignal.id.ToString().ToUpper() );
if (dao.changeTSFSignalId( otherSignal.id, Guid.Parse(model.TSF.uuid) ))
{
LogManager.Info(
"The Database signal uuid has been changed to reflect the Document signal uuid" );
signal.DataState = BASEBean.eDataState.DS_EDIT;
signal.save();
}
}
}
}
}
}
}
}
catch (Exception e)
{
LogManager.Error( e, "An error has occured saving the signal model library: {0}", e.Message );
}
finally
{
HourGlass.Stop();
if (_signalModelLibrary == null)
{
MessageBox.Show(Resources.A_Signal_Model_must_be_selected_to_save_);
}
else
{
LogManager.Trace(Resources.Completed_Saving_Selected_Signal_Model);
MessageBox.Show(Resources.Completed_Saving_Selected_Signal_Model);
}
}
}