using System;
using System.Collections.Generic;
using System.Text;
using Harlinn.DBTool.CodeGenerators.Utils;
using Harlinn.DBTool.Projects;
namespace Harlinn.DBTool.CodeGenerators.Entities
{
public class TagEntityGenerator : GeneratorBase
{
ProjectTable projectTable;
string className;
string dataClassName;
string tagValueBaseName;
string tagValueDataClassName;
ProjectTabularField valueField;
public TagEntityGenerator(ProjectTable projectTable)
{
this.projectTable = projectTable;
className = projectTable.BaseName.Replace("Value", "") + "Entity";
dataClassName = projectTable.BaseName.Replace("Value", "") + "ElementData";
tagValueBaseName = projectTable.BaseName;
tagValueDataClassName = projectTable.DataClassName;
valueField = projectTable.GetFields().GetField("Value");
}
public override string GetFilename()
{
string directory = GetDirectory();
string result = directory + "\\" + className + ".cs";
return result;
}
public override string GetDirectory()
{
string namespace_ = projectTable.GetProject().EntityNamespace;
string directory = projectTable.GetProject().NamespaceToDirectory(namespace_);
return directory;
}
public static void Generate(Project project)
{
List<ProjectTable> tables = project.GetProjectTableList();
foreach (ProjectTable table in tables)
{
if (table.IsTagValue == true)
{
TagEntityGenerator tagEntityGenerator = new TagEntityGenerator(table);
using (tagEntityGenerator)
{
tagEntityGenerator.Generate();
tagEntityGenerator.SaveToFile();
}
}
}
}
public void Generate()
{
string commonNamespace = projectTable.GetProject().CommonNamespace;
string dataNamespace = projectTable.GetProject().DataNamespace;
string entityNamespace = projectTable.GetProject().EntityNamespace;
WriteLine("using System;");
WriteLine("using System.Collections.Generic;");
WriteLine("using System.Runtime.Serialization;");
WriteLine("using System.Threading;");
WriteLine("using System.Reflection;");
WriteLine();
WriteLine("using " + commonNamespace + ";");
WriteLine("using " + dataNamespace + ";");
WriteLine("using " + dataNamespace + ".Utils;");
WriteLine();
WriteLine("namespace " + entityNamespace );
WriteLine("{");
WriteLine();
WriteLine(" public class " + className + "EventArgs : TagEntityEventArgs<" + className + ">");
WriteLine(" {");
WriteLine(" public " + className + "EventArgs(" + className + " tag)");
WriteLine(" : base(tag)");
WriteLine(" {");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" public class " + className + "ValueEventArgs : TagEntityEventArgs<" + className + ">");
WriteLine(" {");
WriteLine(" " + tagValueDataClassName + " tagValue;");
WriteLine();
WriteLine(" public " + className + "ValueEventArgs(" + className + " tag, " + tagValueDataClassName + " tagValue )");
WriteLine(" : base(tag)");
WriteLine(" {");
WriteLine(" this.tagValue = tagValue;");
WriteLine(" }");
WriteLine();
WriteLine(" public " + tagValueDataClassName + " Value");
WriteLine(" {");
WriteLine(" get");
WriteLine(" {");
WriteLine(" return tagValue;");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" public delegate void " + className + "ValueEventDelegate(object sender, " + className + "ValueEventArgs eventArgs);");
WriteLine();
WriteLine(" public class " + className + "ValueDeletedEventArgs : TagEntityEventArgs<" + className + ">");
WriteLine(" {");
WriteLine(" private DateTime timeStamp;");
WriteLine();
WriteLine(" public " + className + "ValueDeletedEventArgs(" + className + " tag, DateTime timeStamp )");
WriteLine(" : base(tag)");
WriteLine(" {");
WriteLine(" this.timeStamp = timeStamp;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" public delegate void " + className + "ValueDeletedEventDelegate(object sender, " + className + "ValueDeletedEventArgs eventArgs);");
WriteLine();
WriteLine(" public partial class " + className + " : TagEntity");
WriteLine(" {");
WriteLine();
WriteLine(" private static readonly log4net.ILog sfLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);");
WriteLine();
WriteLine(" private static void LogException(Exception exc, MethodBase method)");
WriteLine(" {");
WriteLine(" Logger.LogException(sfLog, exc, method);");
WriteLine(" }");
WriteLine();
WriteLine(" public event " + className + "ValueEventDelegate OnValueChanged;");
WriteLine(" public event " + className + "ValueEventDelegate OnNewValue;");
WriteLine(" public event " + className + "ValueDeletedEventDelegate OnValueDeleted;");
WriteLine();
WriteLine(" public " + className + "( EntityContext entityContext )");
WriteLine(" : base(entityContext)");
WriteLine(" {");
WriteLine();
WriteLine(" }");
WriteLine(" public " + className + "( EntityContext entityContext, " + dataClassName + " data)");
WriteLine(" : base(entityContext, data)");
WriteLine(" {");
WriteLine();
WriteLine(" }");
WriteLine();
WriteLine(" private " + dataClassName + " Data");
WriteLine(" {");
WriteLine(" get");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" return (" + dataClassName + ")_Data;");
WriteLine(" }");
WriteLine(" catch (Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" protected override ElementBase CreateData()");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" " + dataClassName + " elementData = new " + dataClassName + "();");
WriteLine(" elementData.ElementState = ElementState.New;");
WriteLine(" return elementData;");
WriteLine(" }");
WriteLine(" catch (Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine();
WriteLine(" public void InitializeIfRequired( )");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" long id = 0;");
WriteLine(" " + dataClassName + " data = null;");
WriteLine(" bool isInitialized = false;");
WriteLine(" if (EnterReadLock())");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" data = Data;");
WriteLine(" if (data != null)");
WriteLine(" {");
WriteLine(" isInitialized = data.IsInitialized;");
WriteLine(" id = data.Id;");
WriteLine(" }");
WriteLine(" }");
WriteLine(" finally");
WriteLine(" {");
WriteLine(" ExitReadLock();");
WriteLine(" }");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" throw new TimeoutException();");
WriteLine(" }");
WriteLine(" if( ( id != 0) && ( isInitialized == false ) )");
WriteLine(" {");
WriteLine(" if (EnterWriteLock())");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" " + tagValueDataClassName + " lastTagValue = Context._Get" + tagValueBaseName + "ForLastTimeStamp(id);");
WriteLine(" if( lastTagValue != null )");
WriteLine(" {");
WriteLine(" data.TimeStamp = lastTagValue.TimeStamp;");
WriteLine(" data.LastUpdate = lastTagValue.TimeStamp;");
WriteLine(" data.Flags = lastTagValue.Flags;");
WriteLine(" data.Value = lastTagValue.Value;");
WriteLine(" data.IsInitialized = true;");
WriteLine(" }");
WriteLine(" }");
WriteLine(" finally");
WriteLine(" {");
WriteLine(" ExitWriteLock();");
WriteLine(" }");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" throw new TimeoutException();");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine(" catch(Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine();
WriteLine(" public " + tagValueDataClassName + " GetValue(DateTime timeStamp)");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" InitializeIfRequired( );");
WriteLine(" long id = 0;");
WriteLine(" " + tagValueDataClassName + " result = null;");
WriteLine(" if (EnterReadLock())");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" " + dataClassName + " data = Data;");
WriteLine(" if (data != null)");
WriteLine(" {");
WriteLine(" id = data.Id;");
WriteLine(" if(timeStamp >= data.TimeStamp) ");
WriteLine(" {");
WriteLine(" result = new " + tagValueDataClassName + "(id,data.TimeStamp,data.Flags,data.Value);");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine(" finally");
WriteLine(" {");
WriteLine(" ExitReadLock();");
WriteLine(" }");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" throw new TimeoutException();");
WriteLine(" }");
WriteLine(" if((result == null)&&(id != 0))");
WriteLine(" {");
WriteLine(" result = Context._Get" + tagValueBaseName + "ForTimeStamp(id,timeStamp);");
WriteLine(" }");
WriteLine(" return result;");
WriteLine(" }");
WriteLine(" catch(Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" public " + tagValueDataClassName + " Current");
WriteLine(" {");
WriteLine(" get");
WriteLine(" {");
WriteLine(" " + tagValueDataClassName + " result = GetValue(DateTime.UtcNow);");
WriteLine(" return result;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" public List<" + tagValueDataClassName + "> GetValues(DateTime start, DateTime end)");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" long id = 0;");
WriteLine(" List<" + tagValueDataClassName + "> result = null;");
WriteLine(" if (EnterReadLock())");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" " + dataClassName + " data = Data;");
WriteLine(" if (data != null)");
WriteLine(" {");
WriteLine(" id = data.Id;");
WriteLine(" }");
WriteLine(" }");
WriteLine(" finally");
WriteLine(" {");
WriteLine(" ExitReadLock();");
WriteLine(" }");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" throw new TimeoutException();");
WriteLine(" }");
WriteLine(" if (id != 0)");
WriteLine(" {");
WriteLine(" result = Context._Get" + tagValueBaseName + "ForInterval(id, start, end);");
WriteLine(" }");
WriteLine(" return result;");
WriteLine(" }");
WriteLine(" catch (Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" public List<" + tagValueDataClassName + "> GetValues( )");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" long id = 0;");
WriteLine(" List<" + tagValueDataClassName + "> result = null;");
WriteLine(" if (EnterReadLock())");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" " + dataClassName + " data = Data;");
WriteLine(" if (data != null)");
WriteLine(" {");
WriteLine(" id = data.Id;");
WriteLine(" }");
WriteLine(" }");
WriteLine(" finally");
WriteLine(" {");
WriteLine(" ExitReadLock();");
WriteLine(" }");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" throw new TimeoutException();");
WriteLine(" }");
WriteLine(" if (id != 0)");
WriteLine(" {");
WriteLine(" result = Context._GetAll" + tagValueBaseName + "s( id );");
WriteLine(" }");
WriteLine(" return result;");
WriteLine(" }");
WriteLine(" catch (Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
if (GeneratorTypeHelper.GetIsCSharpNullableType(valueField))
{
string notNullablePropertyType = valueField.PropertyType.TrimEnd('?');
WriteLine(" public void Log( DateTime timeStamp, long flags, " + notNullablePropertyType + " value )");
WriteLine(" {");
WriteLine(" " + valueField.PropertyType + " nullableValue = value;");
WriteLine(" Log(timeStamp, flags,nullableValue);");
WriteLine(" }");
WriteLine();
}
WriteLine(" public void Log( DateTime timeStamp, long flags, "+valueField.PropertyType+" value )");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" InitializeIfRequired( );");
WriteLine(" bool saveRequired = true;");
WriteLine(" bool changed = false;");
WriteLine(" long id = 0;");
WriteLine(" if (EnterWriteLock())");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" " + dataClassName + " data = Data;");
WriteLine(" if (data != null)");
WriteLine(" {");
WriteLine(" id = data.Id;");
WriteLine();
WriteLine(" if (timeStamp >= data.TimeStamp)");
WriteLine(" {");
WriteLine(" data.LastUpdate = timeStamp;");
WriteLine(" if ((flags == data.Flags) && (CompareHelper.Compare(value, data.Value) == 0))");
WriteLine(" {");
WriteLine(" saveRequired = false;");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" if (data.TimeStamp == timeStamp)");
WriteLine(" {");
WriteLine(" changed = true;");
WriteLine(" }");
WriteLine(" data.TimeStamp = timeStamp;");
WriteLine(" data.Flags = flags;");
WriteLine(" data.Value = value;");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine(" finally");
WriteLine(" {");
WriteLine(" ExitWriteLock();");
WriteLine(" }");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" throw new TimeoutException();");
WriteLine(" }");
WriteLine(" if ((id != 0) && saveRequired )");
WriteLine(" {");
WriteLine(" " + tagValueDataClassName + " data = new " + tagValueDataClassName + "(id, timeStamp, flags, value);");
WriteLine(" if (changed)");
WriteLine(" {");
WriteLine(" Context._Update" + tagValueBaseName + "(data);");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" Context._Insert" + tagValueBaseName + "(data);");
WriteLine(" }");
WriteLine();
WriteLine(" if ((changed) && (OnValueChanged != null))");
WriteLine(" {");
WriteLine(" " + className + "ValueEventArgs eventArgs = new " + className + "ValueEventArgs(this, data);");
WriteLine(" OnValueChanged(this, eventArgs);");
WriteLine(" }");
WriteLine(" else if (OnNewValue != null)");
WriteLine(" {");
WriteLine(" " + className + "ValueEventArgs eventArgs = new " + className + "ValueEventArgs(this, data);");
WriteLine(" OnNewValue(this, eventArgs);");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine(" catch (Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" public void Log(long flags, " + valueField.PropertyType + " value)");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" Log(DateTime.UtcNow, flags, value);");
WriteLine(" }");
WriteLine(" catch (Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" public void Load( List<" + tagValueDataClassName + "> elements )");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" long id = 0;");
WriteLine(" if (EnterReadLock())");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" " + dataClassName + " data = Data;");
WriteLine(" if (data != null)");
WriteLine(" {");
WriteLine(" id = data.Id;");
WriteLine(" }");
WriteLine(" }");
WriteLine(" finally");
WriteLine(" {");
WriteLine(" ExitReadLock();");
WriteLine(" }");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" throw new TimeoutException();");
WriteLine(" }");
WriteLine(" if (id != 0)");
WriteLine(" {");
WriteLine(" Context._Insert" + tagValueBaseName + "List( elements );");
WriteLine(" }");
WriteLine(" }");
WriteLine(" catch (Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine();
WriteLine(" internal void HandleAsynchValueChange( " + tagValueDataClassName + " tagElementData )");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" long id = 0;");
WriteLine(" if (EnterWriteLock())");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" " + dataClassName + " data = Data;");
WriteLine(" if (data != null)");
WriteLine(" {");
WriteLine(" id = data.Id;");
WriteLine();
WriteLine(" if (tagElementData.TimeStamp >= data.TimeStamp)");
WriteLine(" {");
WriteLine(" data.LastUpdate = tagElementData.TimeStamp;");
WriteLine(" data.TimeStamp = tagElementData.TimeStamp;");
WriteLine(" data.Flags = tagElementData.Flags;");
WriteLine(" data.Value = tagElementData.Value;");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine(" finally");
WriteLine(" {");
WriteLine(" ExitWriteLock();");
WriteLine(" }");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" throw new TimeoutException();");
WriteLine(" }");
WriteLine(" if (id != 0) ");
WriteLine(" {");
WriteLine(" if (OnValueChanged != null)");
WriteLine(" {");
WriteLine(" " + className + "ValueEventArgs eventArgs = new " + className + "ValueEventArgs(this, tagElementData);");
WriteLine(" OnValueChanged(this, eventArgs);");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine(" catch (Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" internal void HandleAsynchNewValue(" + tagValueDataClassName + " tagElementData)");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" long id = 0;");
WriteLine(" if (EnterWriteLock())");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" " + dataClassName + " data = Data;");
WriteLine(" if (data != null)");
WriteLine(" {");
WriteLine(" id = data.Id;");
WriteLine();
WriteLine(" if (tagElementData.TimeStamp >= data.TimeStamp)");
WriteLine(" {");
WriteLine(" data.LastUpdate = tagElementData.TimeStamp;");
WriteLine(" data.TimeStamp = tagElementData.TimeStamp;");
WriteLine(" data.Flags = tagElementData.Flags;");
WriteLine(" data.Value = tagElementData.Value;");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine(" finally");
WriteLine(" {");
WriteLine(" ExitWriteLock();");
WriteLine(" }");
WriteLine(" }");
WriteLine(" else");
WriteLine(" {");
WriteLine(" throw new TimeoutException();");
WriteLine(" }");
WriteLine(" if (id != 0)");
WriteLine(" {");
WriteLine(" if (OnNewValue != null)");
WriteLine(" {");
WriteLine(" " + className + "ValueEventArgs eventArgs = new " + className + "ValueEventArgs(this, tagElementData);");
WriteLine(" OnNewValue(this, eventArgs);");
WriteLine(" }");
WriteLine(" }");
WriteLine(" }");
WriteLine(" catch (Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine(" public void HandleValueDeleted( DateTime timeStamp )");
WriteLine(" {");
WriteLine(" try");
WriteLine(" {");
WriteLine(" if( OnValueDeleted != null )");
WriteLine(" {");
WriteLine(" " + className + "ValueDeletedEventArgs eventArgs = new " + className + "ValueDeletedEventArgs( this, timeStamp );");
WriteLine(" OnValueDeleted(this, eventArgs);");
WriteLine(" }");
WriteLine(" }");
WriteLine(" catch (Exception exc)");
WriteLine(" {");
WriteLine(" LogException(exc, MethodBase.GetCurrentMethod());");
WriteLine(" throw;");
WriteLine(" }");
WriteLine(" }");
WriteLine();
WriteLine();
WriteLine(" }");
WriteLine("}");
WriteLine();
}
}
}