Added code to support refreshing display based on changes made by another user

This commit is contained in:
Jim 2015-04-14 02:59:18 +00:00
parent 5282ef114d
commit 36518e7a82
3 changed files with 195 additions and 11 deletions

View File

@ -449,7 +449,7 @@ namespace VEPROMS
{ {
log4net.Appender.FileAppender fApp = (log4net.Appender.FileAppender)iApp; log4net.Appender.FileAppender fApp = (log4net.Appender.FileAppender)iApp;
string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
fApp.File = folderPath + @"\VEPROMS\" + NewFilename; fApp.File = folderPath + @"\VEPROMS\" + (Volian.Base.Library.VlnSettings.GetCommand("U","") + "_").TrimStart("_".ToCharArray()) + NewFilename;
ErrorLogFileName = fApp.File; ErrorLogFileName = fApp.File;
fApp.ActivateOptions(); fApp.ActivateOptions();
return true; // Appender found and name changed to NewFilename return true; // Appender found and name changed to NewFilename
@ -847,6 +847,7 @@ namespace VEPROMS
private SessionInfo MySessionInfo; private SessionInfo MySessionInfo;
private System.Threading.Timer MyActivityTimer; private System.Threading.Timer MyActivityTimer;
private System.Threading.Timer MyRefreshTimer;
private DevComponents.DotNetBar.ButtonItem btnManageSecurity; private DevComponents.DotNetBar.ButtonItem btnManageSecurity;
private DevComponents.DotNetBar.ButtonItem btnResetSecurity; private DevComponents.DotNetBar.ButtonItem btnResetSecurity;
private DevComponents.DotNetBar.ButtonItem btnAdministrativeTools; private DevComponents.DotNetBar.ButtonItem btnAdministrativeTools;
@ -855,17 +856,52 @@ namespace VEPROMS
{ {
get { return _MyCloseTabList; } get { return _MyCloseTabList; }
} }
private int myCounterPingSession = 0;
private int myCounterRefreshChanged = 0;
private void PingSession(Object obj) private void PingSession(Object obj)
{ {
myCounterPingSession++;
if (myCounterPingSession > 10)
{
_MyLog.InfoFormat("Ping Session at: {0} with LastChanged of: {1}", DateTime.Now.ToString("yyyyMMdd HHmmssnnn"), MySessionInfo.LastChanged);
myCounterPingSession = 0;
}
MySemaphore.WaitOne();
List<int> myList = MySessionInfo.PingSession(); List<int> myList = MySessionInfo.PingSession();
foreach (DisplayTabItem dti in tc.MyBar.Items) foreach (DisplayTabItem dti in tc.MyBar.Items)
{ {
if (!myList.Contains(dti.OwnerID)) if (!myList.Contains(dti.OwnerID))
MyCloseTabList.PushDTI(dti); MyCloseTabList.PushDTI(dti);
} }
MySemaphore.Release();
}
private void RefreshChanged(Object obj)
{
myCounterRefreshChanged++;
if (myCounterRefreshChanged > 10)
{
_MyLog.InfoFormat("RefreshChanged at: {0} with LastChanged of: {1}", DateTime.Now.ToString("yyyyMMdd HHmmssnnn"), MySessionInfo.LastChanged);
myCounterRefreshChanged = 0;
}
MySemaphore.WaitOne();
string lastChanged = string.Empty;
foreach (int id in MySessionInfo.ChangedContents.Keys)
{
using (Content c = Content.Get(id))
{
_MyLog.InfoFormat("Text of contentid: {0} is {1}", id, c.Text);
ContentInfo.Refresh(c);
lastChanged = MySessionInfo.ChangedContents[id];
_MyLog.InfoFormat("Refreshing contentid: {0} with LastChanged of {1}", id, lastChanged);
}
}
MySessionInfo.ChangedContents.Clear();
if(lastChanged != string.Empty)
MySessionInfo.LastChanged = lastChanged;
MySemaphore.Release();
} }
public Timer tmrCloseTabItems; public Timer tmrCloseTabItems;
public System.Threading.Semaphore MySemaphore = new System.Threading.Semaphore(1, 1);
private void frmVEPROMS_Load(object sender, EventArgs e) private void frmVEPROMS_Load(object sender, EventArgs e)
{ {
InitializeSecurity(); InitializeSecurity();
@ -922,11 +958,15 @@ namespace VEPROMS
tv.MySessionInfo = MySessionInfo; tv.MySessionInfo = MySessionInfo;
System.Threading.AutoResetEvent autoEvent = new System.Threading.AutoResetEvent(false); System.Threading.AutoResetEvent autoEvent = new System.Threading.AutoResetEvent(false);
//System.Threading.TimerCallback timerDelegate = new System.Threading.TimerCallback(MySessionInfo.PingSession); //System.Threading.TimerCallback timerDelegate = new System.Threading.TimerCallback(MySessionInfo.PingSession);
//System.Diagnostics.Process xyzzy = System.Diagnostics.Process.GetCurrentProcess();
if(!System.Diagnostics.Debugger.IsAttached)
{
System.Threading.TimerCallback timerDelegate = new System.Threading.TimerCallback(this.PingSession); System.Threading.TimerCallback timerDelegate = new System.Threading.TimerCallback(this.PingSession);
if (!System.Diagnostics.Process.GetCurrentProcess().ProcessName.ToLower().EndsWith("vshost"))
//MyActivityTimer = new System.Threading.Timer(timerDelegate, autoEvent, 30000, 30000);
MyActivityTimer = new System.Threading.Timer(timerDelegate, autoEvent, 10000, 10000); MyActivityTimer = new System.Threading.Timer(timerDelegate, autoEvent, 10000, 10000);
System.Threading.Thread.Sleep(5000);
System.Threading.TimerCallback timerRefresh = new System.Threading.TimerCallback(this.RefreshChanged);
MyRefreshTimer = new System.Threading.Timer(timerRefresh, autoEvent, 10000, 10000);
}
//string debugMode = ConfigurationManager.AppSettings["Debug"]; //string debugMode = ConfigurationManager.AppSettings["Debug"];
//VlnSettings.DebugMode = bool.Parse(debugMode); // set debug for the Volian.Controls.Library //VlnSettings.DebugMode = bool.Parse(debugMode); // set debug for the Volian.Controls.Library
@ -2220,8 +2260,7 @@ namespace VEPROMS
{ {
if (args.MyEditItem.MyItemInfo.IsSection || args.MyEditItem.MyItemInfo.IsProcedure) if (args.MyEditItem.MyItemInfo.IsSection || args.MyEditItem.MyItemInfo.IsProcedure)
{ {
infotabRO.Visible = false; infotabRO.Visible = infotabTransition.Visible = false;
infotabTransition.Visible = args.MyEditItem.MyItemInfo.ActiveFormat.PlantFormat.FormatData.TransData.AllowTransitionFromSection;
infotabTags.Visible = false; infotabTags.Visible = false;
displayTags.Visible = false; displayTags.Visible = false;
} }

View File

@ -554,6 +554,10 @@ namespace VEPROMS.CSLA.Library
} }
public partial class ContentInfo public partial class ContentInfo
{ {
public static bool IsInCache(int contentID)
{
return _CacheByPrimaryKey.ContainsKey(contentID.ToString());
}
public static event StaticContentInfoEvent StaticContentInfoChange; public static event StaticContentInfoEvent StaticContentInfoChange;
private static void OnStaticContentInfoChange(object sender, StaticContentInfoEventArgs args) private static void OnStaticContentInfoChange(object sender, StaticContentInfoEventArgs args)
{ {
@ -979,5 +983,66 @@ namespace VEPROMS.CSLA.Library
} }
this.RaiseListChangedEvents = true; this.RaiseListChangedEvents = true;
} }
public static ContentInfoList GetChangedList(byte[] lastChanged)
{
try
{
ContentInfoList tmp = DataPortal.Fetch<ContentInfoList>(new ChangeListCriteria(lastChanged));
// ContentInfo.AddList(tmp);
tmp.AddEvents();
return tmp;
}
catch (Exception ex)
{
throw new DbCslaException("Error on ContentInfoList.GetChangedList", ex);
}
}
[Serializable()]
private class ChangeListCriteria
{
private byte[] _LastChanged;
public byte[] LastChanged
{
get { return _LastChanged; }
set { _LastChanged = value; }
}
public ChangeListCriteria(byte[] lastChanged)
{
_LastChanged = lastChanged;
}
}
private void DataPortal_Fetch(ChangeListCriteria criteria)
{
this.RaiseListChangedEvents = false;
try
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cm = cn.CreateCommand())
{
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "vesp_ListContentsAfterLastChanged";
cm.Parameters.AddWithValue("@LastChanged", criteria.LastChanged);
cm.CommandTimeout = Database.DefaultTimeout;
using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader()))
{
IsReadOnly = false;
while (dr.Read())
{
ContentInfo contentInfo = new ContentInfo(dr);
this.Add(contentInfo);
}
IsReadOnly = true;
}
}
}
}
catch (Exception ex)
{
Database.LogException("ContentInfoList.DataPortal_Fetch", ex);
throw new DbCslaException("ContentInfoList.DataPortal_Fetch", ex);
}
this.RaiseListChangedEvents = true;
}
} }
} }

View File

@ -68,6 +68,17 @@ namespace VEPROMS.CSLA.Library
#region SessionInfo stuff #region SessionInfo stuff
public partial class SessionInfo public partial class SessionInfo
{ {
private string _LastChanged = string.Empty;
public string LastChanged
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty("LastChanged", true);
return _LastChanged;
}
set { _LastChanged = value; }
}
public static SessionInfo BeginSession(string machineName, int processID) public static SessionInfo BeginSession(string machineName, int processID)
{ {
try try
@ -85,10 +96,26 @@ namespace VEPROMS.CSLA.Library
throw new DbCslaException("Error on SessionInfo.BeginSession", ex); throw new DbCslaException("Error on SessionInfo.BeginSession", ex);
} }
} }
private Dictionary<int, string> _ChangedContents;
public Dictionary<int, string> ChangedContents
{
get { return _ChangedContents; }
set { _ChangedContents = value; }
}
public List<int> PingSession() public List<int> PingSession()
{ {
List<int> myList = new List<int>(); List<int> myList = new List<int>();
SessionPing.Execute(this.SessionID); SessionPing.Execute(this.SessionID);
ChangedContents = SessionChangedContents.Execute(this.LastChanged);
//ContentInfoList cil = ContentInfoList.GetChangedList(Convert.FromBase64String(this.LastChanged));
//foreach (ContentInfo ci in cil)
// if (!ChangedContentIDs.ContainsKey(ci.ContentID))
// ChangedContentIDs.Add(ci.ContentID, false);
//foreach(ContentInfo ci in cil)
// if(ContentInfo.IsInCache(ci.ContentID))
// using (Content cc = ci.Get())
// ContentInfo.Refresh(cc);
OwnerInfoList oil = OwnerInfoList.GetBySessionID(this.SessionID); OwnerInfoList oil = OwnerInfoList.GetBySessionID(this.SessionID);
foreach (OwnerInfo oi in oil) foreach (OwnerInfo oi in oil)
myList.Add(oi.OwnerID); myList.Add(oi.OwnerID);
@ -188,6 +215,7 @@ namespace VEPROMS.CSLA.Library
return; return;
} }
ReadData(dr); ReadData(dr);
_LastChanged = Convert.ToBase64String(dr["LastChanged"] as byte[]);
} }
} }
// removing of item only needed for local data portal // removing of item only needed for local data portal
@ -572,6 +600,58 @@ namespace VEPROMS.CSLA.Library
} }
#endregion #endregion
} }
public class SessionChangedContents : CommandBase
{
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private string _LastChanged;
public string LastChanged
{
get { return _LastChanged; }
set { _LastChanged = value; }
}
private Dictionary<int, string> _ChangedContents;
public Dictionary<int, string> ChangedContents
{
get { return _ChangedContents; }
set { _ChangedContents = value; }
}
#region Factory Methods
public static Dictionary<int, string> Execute(string lastChanged)
{
SessionChangedContents cmd = new SessionChangedContents();
cmd.LastChanged = lastChanged;
cmd = DataPortal.Execute<SessionChangedContents>(cmd);
return cmd.ChangedContents;
}
#endregion
#region Server-Side Code
protected override void DataPortal_Execute()
{
try
{
using (SqlConnection cn = Database.VEPROMS_SqlConnection)
{
using (SqlCommand cmd = new SqlCommand("vesp_ListContentsAfterLastChanged2", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 0;
cmd.Parameters.AddWithValue("@LastChanged", Convert.FromBase64String(LastChanged));
cmd.Parameters.AddWithValue("@UserID", Volian.Base.Library.VlnSettings.UserID);
SqlDataReader dr = cmd.ExecuteReader();
ChangedContents = new Dictionary<int, string>();
while (dr.Read())
ChangedContents.Add(dr.GetInt32(0), Convert.ToBase64String(dr["LastChanged"] as byte[]));
}
}
}
catch (Exception ex)
{
if (_MyLog.IsErrorEnabled) _MyLog.Error("SessionChangedContents Error", ex);
throw new ApplicationException("Failure on SessionChangedContents", ex);
}
}
#endregion
}
#endregion #endregion
#region OwnerInfo stuff #region OwnerInfo stuff
public partial class OwnerInfoList public partial class OwnerInfoList