This commit is contained in:
Kathy Ruffing 2008-08-12 11:25:17 +00:00
parent 25458190e6
commit 50e163dae0
8 changed files with 493 additions and 279 deletions

View File

@ -54,28 +54,36 @@ namespace VEPROMS.CSLA.Library
}
#endregion
#region Collection
protected static List<DocVersion> _AllList = new List<DocVersion>();
private static Dictionary<string, List<DocVersion>> _AllByPrimaryKey = new Dictionary<string, List<DocVersion>>();
private static List<DocVersion> _CacheList = new List<DocVersion>();
protected static void AddToCache(DocVersion docVersion)
{
if (!_CacheList.Contains(docVersion)) _CacheList.Add(docVersion); // In AddToCache
}
protected static void RemoveFromCache(DocVersion docVersion)
{
while (_CacheList.Contains(docVersion)) _CacheList.Remove(docVersion); // In RemoveFromCache
}
private static Dictionary<string, List<DocVersion>> _CacheByPrimaryKey = new Dictionary<string, List<DocVersion>>();
private static void ConvertListToDictionary()
{
List<DocVersion> remove = new List<DocVersion>();
foreach (DocVersion tmp in _AllList)
foreach (DocVersion tmp in _CacheList)
{
if (!_AllByPrimaryKey.ContainsKey(tmp.VersionID.ToString()))
if (!_CacheByPrimaryKey.ContainsKey(tmp.VersionID.ToString()))
{
_AllByPrimaryKey[tmp.VersionID.ToString()] = new List<DocVersion>(); // Add new list for PrimaryKey
_CacheByPrimaryKey[tmp.VersionID.ToString()] = new List<DocVersion>(); // Add new list for PrimaryKey
}
_AllByPrimaryKey[tmp.VersionID.ToString()].Add(tmp); // Add to Primary Key list
_CacheByPrimaryKey[tmp.VersionID.ToString()].Add(tmp); // Add to Primary Key list
remove.Add(tmp);
}
foreach (DocVersion tmp in remove)
_AllList.Remove(tmp);
RemoveFromCache(tmp);
}
public static DocVersion GetExistingByPrimaryKey(int versionID)
protected static DocVersion GetCachedByPrimaryKey(int versionID)
{
ConvertListToDictionary();
string key = versionID.ToString();
if (_AllByPrimaryKey.ContainsKey(key)) return _AllByPrimaryKey[key][0];
if (_CacheByPrimaryKey.ContainsKey(key)) return _CacheByPrimaryKey[key][0];
return null;
}
#endregion
@ -223,7 +231,7 @@ namespace VEPROMS.CSLA.Library
set
{
CanWriteProperty("MyItem", true);
if (_MyItem != value)
if ((_MyItem == null ? _ItemID : (int?)_MyItem.ItemID) != (value == null ? null : (int?)value.ItemID))
{
_MyItem = value;
_ItemID = (value == null ? null : (int?)value.ItemID);
@ -256,7 +264,7 @@ namespace VEPROMS.CSLA.Library
set
{
CanWriteProperty("MyFormat", true);
if (_MyFormat != value)
if ((_MyFormat == null ? _FormatID : (int?)_MyFormat.FormatID) != (value == null ? null : (int?)value.FormatID))
{
_MyFormat = value;
_FormatID = (value == null ? null : (int?)value.FormatID);
@ -497,24 +505,29 @@ namespace VEPROMS.CSLA.Library
public int CurrentEditLevel
{ get { return EditLevel; } }
private static int _DocVersionUnique = 0;
private int _MyDocVersionUnique;
protected static int DocVersionUnique
{ get { return ++_DocVersionUnique; } }
private int _MyDocVersionUnique = DocVersionUnique;
public int MyDocVersionUnique
{
get { return _MyDocVersionUnique; }
}
{ get { return _MyDocVersionUnique; } }
protected DocVersion()
{/* require use of factory methods */
_MyDocVersionUnique = ++_DocVersionUnique;
_AllList.Add(this);
AddToCache(this);
}
public void Dispose()
{
_AllList.Remove(this);
if (!_AllByPrimaryKey.ContainsKey(VersionID.ToString())) return;
List<DocVersion> listDocVersion = _AllByPrimaryKey[VersionID.ToString()]; // Get the list of items
listDocVersion.Remove(this); // Remove the item from the list
if (listDocVersion.Count == 0) //If there are no items left in the list
_AllByPrimaryKey.Remove(VersionID.ToString()); // remove the list
RemoveFromDictionaries();
}
private void RemoveFromDictionaries()
{
RemoveFromCache(this);
if (_CacheByPrimaryKey.ContainsKey(VersionID.ToString()))
{
List<DocVersion> listDocVersion = _CacheByPrimaryKey[VersionID.ToString()]; // Get the list of items
while (listDocVersion.Contains(this)) listDocVersion.Remove(this); // Remove the item from the list
if (listDocVersion.Count == 0) //If there are no items left in the list
_CacheByPrimaryKey.Remove(VersionID.ToString()); // remove the list
}
}
public static DocVersion New()
{
@ -554,7 +567,11 @@ namespace VEPROMS.CSLA.Library
{
DocVersion tmp = DocVersion.New(myFolder, versionType, name, title, myItem, myFormat, config, dts, userID);
if (tmp.IsSavable)
tmp = tmp.Save();
{
DocVersion tmp2 = tmp;
tmp = tmp2.Save();
tmp2.Dispose();
}
else
{
Csla.Validation.BrokenRulesCollection brc = tmp.ValidationRules.GetBrokenRules();
@ -581,7 +598,11 @@ namespace VEPROMS.CSLA.Library
{
DocVersion tmp = DocVersion.New(myFolder, name, title, myItem, myFormat, config);
if (tmp.IsSavable)
tmp = tmp.Save();
{
DocVersion tmp2 = tmp;
tmp = tmp2.Save();
tmp2.Dispose();
}
else
{
Csla.Validation.BrokenRulesCollection brc = tmp.ValidationRules.GetBrokenRules();
@ -599,13 +620,17 @@ namespace VEPROMS.CSLA.Library
throw new System.Security.SecurityException("User not authorized to view a DocVersion");
try
{
DocVersion tmp = GetExistingByPrimaryKey(versionID);
DocVersion tmp = GetCachedByPrimaryKey(versionID);
if (tmp == null)
{
tmp = DataPortal.Fetch<DocVersion>(new PKCriteria(versionID));
if (!_AllList.Contains(tmp)) _AllList.Add(tmp);
AddToCache(tmp);
}
if (tmp.ErrorMessage == "No Record Found")
{
tmp.Dispose(); // Clean-up DocVersion
tmp = null;
}
if (tmp.ErrorMessage == "No Record Found") tmp = null;
return tmp;
}
catch (Exception ex)
@ -647,7 +672,8 @@ namespace VEPROMS.CSLA.Library
{
BuildRefreshList();
DocVersion docVersion = base.Save();
_AllList.Add(docVersion);//Refresh the item in AllList
RemoveFromDictionaries(); // if save is successful remove the previous Folder from the cache
AddToCache(docVersion);//Refresh the item in AllList
ProcessRefreshList();
return docVersion;
}

View File

@ -36,32 +36,40 @@ namespace VEPROMS.CSLA.Library
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
#endregion
#region Collection
protected static List<DocVersionInfo> _AllList = new List<DocVersionInfo>();
private static Dictionary<string, List<DocVersionInfo>> _AllByPrimaryKey = new Dictionary<string, List<DocVersionInfo>>();
private static List<DocVersionInfo> _CacheList = new List<DocVersionInfo>();
protected static void AddToCache(DocVersionInfo docVersionInfo)
{
if (!_CacheList.Contains(docVersionInfo)) _CacheList.Add(docVersionInfo); // In AddToCache
}
protected static void RemoveFromCache(DocVersionInfo docVersionInfo)
{
while (_CacheList.Contains(docVersionInfo)) _CacheList.Remove(docVersionInfo); // In RemoveFromCache
}
private static Dictionary<string, List<DocVersionInfo>> _CacheByPrimaryKey = new Dictionary<string, List<DocVersionInfo>>();
private static void ConvertListToDictionary()
{
List<DocVersionInfo> remove = new List<DocVersionInfo>();
foreach (DocVersionInfo tmp in _AllList)
foreach (DocVersionInfo tmp in _CacheList)
{
if (!_AllByPrimaryKey.ContainsKey(tmp.VersionID.ToString()))
if (!_CacheByPrimaryKey.ContainsKey(tmp.VersionID.ToString()))
{
_AllByPrimaryKey[tmp.VersionID.ToString()] = new List<DocVersionInfo>(); // Add new list for PrimaryKey
_CacheByPrimaryKey[tmp.VersionID.ToString()] = new List<DocVersionInfo>(); // Add new list for PrimaryKey
}
_AllByPrimaryKey[tmp.VersionID.ToString()].Add(tmp); // Add to Primary Key list
_CacheByPrimaryKey[tmp.VersionID.ToString()].Add(tmp); // Add to Primary Key list
remove.Add(tmp);
}
foreach (DocVersionInfo tmp in remove)
_AllList.Remove(tmp);
RemoveFromCache(tmp);
}
internal static void AddList(DocVersionInfoList lst)
{
foreach (DocVersionInfo item in lst) _AllList.Add(item);
foreach (DocVersionInfo item in lst) AddToCache(item);
}
public static DocVersionInfo GetExistingByPrimaryKey(int versionID)
protected static DocVersionInfo GetCachedByPrimaryKey(int versionID)
{
ConvertListToDictionary();
string key = versionID.ToString();
if (_AllByPrimaryKey.ContainsKey(key)) return _AllByPrimaryKey[key][0];
if (_CacheByPrimaryKey.ContainsKey(key)) return _CacheByPrimaryKey[key][0];
return null;
}
#endregion
@ -243,24 +251,23 @@ namespace VEPROMS.CSLA.Library
#endregion
#region Factory Methods
private static int _DocVersionInfoUnique = 0;
private int _MyDocVersionInfoUnique;
private static int DocVersionInfoUnique
{ get { return ++_DocVersionInfoUnique; } }
private int _MyDocVersionInfoUnique = DocVersionInfoUnique;
public int MyDocVersionInfoUnique
{
get { return _MyDocVersionInfoUnique; }
}
private DocVersionInfo()
{ get { return _MyDocVersionInfoUnique; } }
protected DocVersionInfo()
{/* require use of factory methods */
_MyDocVersionInfoUnique = ++_DocVersionInfoUnique;
_AllList.Add(this);
AddToCache(this);
}
public void Dispose()
{
_AllList.Remove(this);
if (!_AllByPrimaryKey.ContainsKey(VersionID.ToString())) return;
List<DocVersionInfo> listDocVersionInfo = _AllByPrimaryKey[VersionID.ToString()]; // Get the list of items
listDocVersionInfo.Remove(this); // Remove the item from the list
RemoveFromCache(this);
if (!_CacheByPrimaryKey.ContainsKey(VersionID.ToString())) return;
List<DocVersionInfo> listDocVersionInfo = _CacheByPrimaryKey[VersionID.ToString()]; // Get the list of items
while (listDocVersionInfo.Contains(this)) listDocVersionInfo.Remove(this); // Remove the item from the list
if (listDocVersionInfo.Count == 0) // If there are no items left in the list
_AllByPrimaryKey.Remove(VersionID.ToString()); // remove the list
_CacheByPrimaryKey.Remove(VersionID.ToString()); // remove the list
}
public virtual DocVersion Get()
{
@ -270,15 +277,15 @@ namespace VEPROMS.CSLA.Library
{
string key = tmp.VersionID.ToString();
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(key))
foreach (DocVersionInfo tmpInfo in _AllByPrimaryKey[key])
if (_CacheByPrimaryKey.ContainsKey(key))
foreach (DocVersionInfo tmpInfo in _CacheByPrimaryKey[key])
tmpInfo.RefreshFields(tmp);
}
private void RefreshFields(DocVersion tmp)
protected virtual void RefreshFields(DocVersion tmp)
{
if (_FolderID != tmp.FolderID)
{
MyFolder.RefreshFolderDocVersions(); // Update List for old value
if (MyFolder != null) MyFolder.RefreshFolderDocVersions(); // Update List for old value
_FolderID = tmp.FolderID; // Update the value
}
_MyFolder = null; // Reset list so that the next line gets a new list
@ -288,14 +295,14 @@ namespace VEPROMS.CSLA.Library
_Title = tmp.Title;
if (_ItemID != tmp.ItemID)
{
MyItem.RefreshItemDocVersions(); // Update List for old value
if (MyItem != null) MyItem.RefreshItemDocVersions(); // Update List for old value
_ItemID = tmp.ItemID; // Update the value
}
_MyItem = null; // Reset list so that the next line gets a new list
if (MyItem != null) MyItem.RefreshItemDocVersions(); // Update List for new value
if (_FormatID != tmp.FormatID)
{
MyFormat.RefreshFormatDocVersions(); // Update List for old value
if (MyFormat != null) MyFormat.RefreshFormatDocVersions(); // Update List for old value
_FormatID = tmp.FormatID; // Update the value
}
_MyFormat = null; // Reset list so that the next line gets a new list
@ -313,25 +320,25 @@ namespace VEPROMS.CSLA.Library
{
string key = tmp.VersionID.ToString();
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(key))
foreach (DocVersionInfo tmpInfo in _AllByPrimaryKey[key])
if (_CacheByPrimaryKey.ContainsKey(key))
foreach (DocVersionInfo tmpInfo in _CacheByPrimaryKey[key])
tmpInfo.RefreshFields(tmp);
}
private void RefreshFields(FolderDocVersion tmp)
protected virtual void RefreshFields(FolderDocVersion tmp)
{
_VersionType = tmp.VersionType;
_Name = tmp.Name;
_Title = tmp.Title;
if (_ItemID != tmp.ItemID)
{
MyItem.RefreshItemDocVersions(); // Update List for old value
if (MyItem != null) MyItem.RefreshItemDocVersions(); // Update List for old value
_ItemID = tmp.ItemID; // Update the value
}
_MyItem = null; // Reset list so that the next line gets a new list
if (MyItem != null) MyItem.RefreshItemDocVersions(); // Update List for new value
if (_FormatID != tmp.FormatID)
{
MyFormat.RefreshFormatDocVersions(); // Update List for old value
if (MyFormat != null) MyFormat.RefreshFormatDocVersions(); // Update List for old value
_FormatID = tmp.FormatID; // Update the value
}
_MyFormat = null; // Reset list so that the next line gets a new list
@ -349,15 +356,15 @@ namespace VEPROMS.CSLA.Library
{
string key = tmp.VersionID.ToString();
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(key))
foreach (DocVersionInfo tmpInfo in _AllByPrimaryKey[key])
if (_CacheByPrimaryKey.ContainsKey(key))
foreach (DocVersionInfo tmpInfo in _CacheByPrimaryKey[key])
tmpInfo.RefreshFields(tmp);
}
private void RefreshFields(FormatDocVersion tmp)
protected virtual void RefreshFields(FormatDocVersion tmp)
{
if (_FolderID != tmp.FolderID)
{
MyFolder.RefreshFolderDocVersions(); // Update List for old value
if (MyFolder != null) MyFolder.RefreshFolderDocVersions(); // Update List for old value
_FolderID = tmp.FolderID; // Update the value
}
_MyFolder = null; // Reset list so that the next line gets a new list
@ -367,7 +374,7 @@ namespace VEPROMS.CSLA.Library
_Title = tmp.Title;
if (_ItemID != tmp.ItemID)
{
MyItem.RefreshItemDocVersions(); // Update List for old value
if (MyItem != null) MyItem.RefreshItemDocVersions(); // Update List for old value
_ItemID = tmp.ItemID; // Update the value
}
_MyItem = null; // Reset list so that the next line gets a new list
@ -385,15 +392,15 @@ namespace VEPROMS.CSLA.Library
{
string key = tmp.VersionID.ToString();
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(key))
foreach (DocVersionInfo tmpInfo in _AllByPrimaryKey[key])
if (_CacheByPrimaryKey.ContainsKey(key))
foreach (DocVersionInfo tmpInfo in _CacheByPrimaryKey[key])
tmpInfo.RefreshFields(tmp);
}
private void RefreshFields(ItemDocVersion tmp)
protected virtual void RefreshFields(ItemDocVersion tmp)
{
if (_FolderID != tmp.FolderID)
{
MyFolder.RefreshFolderDocVersions(); // Update List for old value
if (MyFolder != null) MyFolder.RefreshFolderDocVersions(); // Update List for old value
_FolderID = tmp.FolderID; // Update the value
}
_MyFolder = null; // Reset list so that the next line gets a new list
@ -403,7 +410,7 @@ namespace VEPROMS.CSLA.Library
_Title = tmp.Title;
if (_FormatID != tmp.FormatID)
{
MyFormat.RefreshFormatDocVersions(); // Update List for old value
if (MyFormat != null) MyFormat.RefreshFormatDocVersions(); // Update List for old value
_FormatID = tmp.FormatID; // Update the value
}
_MyFormat = null; // Reset list so that the next line gets a new list
@ -423,13 +430,17 @@ namespace VEPROMS.CSLA.Library
// throw new System.Security.SecurityException("User not authorized to view a DocVersion");
try
{
DocVersionInfo tmp = GetExistingByPrimaryKey(versionID);
DocVersionInfo tmp = GetCachedByPrimaryKey(versionID);
if (tmp == null)
{
tmp = DataPortal.Fetch<DocVersionInfo>(new PKCriteria(versionID));
if (!_AllList.Contains(tmp)) _AllList.Add(tmp);
AddToCache(tmp);
}
if (tmp.ErrorMessage == "No Record Found")
{
tmp.Dispose(); // Clean-up DocVersionInfo
tmp = null;
}
if (tmp.ErrorMessage == "No Record Found") tmp = null;
return tmp;
}
catch (Exception ex)
@ -441,7 +452,6 @@ namespace VEPROMS.CSLA.Library
#region Data Access Portal
internal DocVersionInfo(SafeDataReader dr)
{
_MyDocVersionInfoUnique = ++_DocVersionInfoUnique;
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] DocVersionInfo.Constructor", GetHashCode());
try
{

View File

@ -52,28 +52,36 @@ namespace VEPROMS.CSLA.Library
}
#endregion
#region Collection
protected static List<Entry> _AllList = new List<Entry>();
private static Dictionary<string, List<Entry>> _AllByPrimaryKey = new Dictionary<string, List<Entry>>();
private static List<Entry> _CacheList = new List<Entry>();
protected static void AddToCache(Entry entry)
{
if (!_CacheList.Contains(entry)) _CacheList.Add(entry); // In AddToCache
}
protected static void RemoveFromCache(Entry entry)
{
while (_CacheList.Contains(entry)) _CacheList.Remove(entry); // In RemoveFromCache
}
private static Dictionary<string, List<Entry>> _CacheByPrimaryKey = new Dictionary<string, List<Entry>>();
private static void ConvertListToDictionary()
{
List<Entry> remove = new List<Entry>();
foreach (Entry tmp in _AllList)
foreach (Entry tmp in _CacheList)
{
if (!_AllByPrimaryKey.ContainsKey(tmp.ContentID.ToString()))
if (!_CacheByPrimaryKey.ContainsKey(tmp.ContentID.ToString()))
{
_AllByPrimaryKey[tmp.ContentID.ToString()] = new List<Entry>(); // Add new list for PrimaryKey
_CacheByPrimaryKey[tmp.ContentID.ToString()] = new List<Entry>(); // Add new list for PrimaryKey
}
_AllByPrimaryKey[tmp.ContentID.ToString()].Add(tmp); // Add to Primary Key list
_CacheByPrimaryKey[tmp.ContentID.ToString()].Add(tmp); // Add to Primary Key list
remove.Add(tmp);
}
foreach (Entry tmp in remove)
_AllList.Remove(tmp);
RemoveFromCache(tmp);
}
public static Entry GetExistingByPrimaryKey(int contentID)
protected static Entry GetCachedByPrimaryKey(int contentID)
{
ConvertListToDictionary();
string key = contentID.ToString();
if (_AllByPrimaryKey.ContainsKey(key)) return _AllByPrimaryKey[key][0];
if (_CacheByPrimaryKey.ContainsKey(key)) return _CacheByPrimaryKey[key][0];
return null;
}
#endregion
@ -326,24 +334,29 @@ namespace VEPROMS.CSLA.Library
public int CurrentEditLevel
{ get { return EditLevel; } }
private static int _EntryUnique = 0;
private int _MyEntryUnique;
protected static int EntryUnique
{ get { return ++_EntryUnique; } }
private int _MyEntryUnique = EntryUnique;
public int MyEntryUnique
{
get { return _MyEntryUnique; }
}
{ get { return _MyEntryUnique; } }
protected Entry()
{/* require use of factory methods */
_MyEntryUnique = ++_EntryUnique;
_AllList.Add(this);
AddToCache(this);
}
public void Dispose()
{
_AllList.Remove(this);
if (!_AllByPrimaryKey.ContainsKey(ContentID.ToString())) return;
List<Entry> listEntry = _AllByPrimaryKey[ContentID.ToString()]; // Get the list of items
listEntry.Remove(this); // Remove the item from the list
if (listEntry.Count == 0) //If there are no items left in the list
_AllByPrimaryKey.Remove(ContentID.ToString()); // remove the list
RemoveFromDictionaries();
}
private void RemoveFromDictionaries()
{
RemoveFromCache(this);
if (_CacheByPrimaryKey.ContainsKey(ContentID.ToString()))
{
List<Entry> listEntry = _CacheByPrimaryKey[ContentID.ToString()]; // Get the list of items
while (listEntry.Contains(this)) listEntry.Remove(this); // Remove the item from the list
if (listEntry.Count == 0) //If there are no items left in the list
_CacheByPrimaryKey.Remove(ContentID.ToString()); // remove the list
}
}
public static Entry New()
{
@ -365,6 +378,26 @@ namespace VEPROMS.CSLA.Library
tmp.MyDocument = myDocument;
return tmp;
}
public static Entry MakeEntry(Content myContent, Document myDocument)
{
Entry tmp = Entry.New(myContent, myDocument);
if (tmp.IsSavable)
{
Entry tmp2 = tmp;
tmp = tmp2.Save();
tmp2.Dispose();
}
else
{
Csla.Validation.BrokenRulesCollection brc = tmp.ValidationRules.GetBrokenRules();
tmp._ErrorMessage = "Failed Validation:";
foreach (Csla.Validation.BrokenRule br in brc)
{
tmp._ErrorMessage += "\r\n\tFailure: " + br.RuleName;
}
}
return tmp;
}
public static Entry New(Content myContent, Document myDocument, DateTime dts, string userID)
{
Entry tmp = Entry.New();
@ -378,7 +411,11 @@ namespace VEPROMS.CSLA.Library
{
Entry tmp = Entry.New(myContent, myDocument, dts, userID);
if (tmp.IsSavable)
tmp = tmp.Save();
{
Entry tmp2 = tmp;
tmp = tmp2.Save();
tmp2.Dispose();
}
else
{
Csla.Validation.BrokenRulesCollection brc = tmp.ValidationRules.GetBrokenRules();
@ -404,13 +441,17 @@ namespace VEPROMS.CSLA.Library
throw new System.Security.SecurityException("User not authorized to view a Entry");
try
{
Entry tmp = GetExistingByPrimaryKey(contentID);
Entry tmp = GetCachedByPrimaryKey(contentID);
if (tmp == null)
{
tmp = DataPortal.Fetch<Entry>(new PKCriteria(contentID));
if (!_AllList.Contains(tmp)) _AllList.Add(tmp);
AddToCache(tmp);
}
if (tmp.ErrorMessage == "No Record Found")
{
tmp.Dispose(); // Clean-up Entry
tmp = null;
}
if (tmp.ErrorMessage == "No Record Found") tmp = null;
return tmp;
}
catch (Exception ex)
@ -452,7 +493,8 @@ namespace VEPROMS.CSLA.Library
{
BuildRefreshList();
Entry entry = base.Save();
_AllList.Add(entry);//Refresh the item in AllList
RemoveFromDictionaries(); // if save is successful remove the previous Folder from the cache
AddToCache(entry);//Refresh the item in AllList
ProcessRefreshList();
return entry;
}

View File

@ -36,32 +36,40 @@ namespace VEPROMS.CSLA.Library
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
#endregion
#region Collection
protected static List<EntryInfo> _AllList = new List<EntryInfo>();
private static Dictionary<string, List<EntryInfo>> _AllByPrimaryKey = new Dictionary<string, List<EntryInfo>>();
private static List<EntryInfo> _CacheList = new List<EntryInfo>();
protected static void AddToCache(EntryInfo entryInfo)
{
if (!_CacheList.Contains(entryInfo)) _CacheList.Add(entryInfo); // In AddToCache
}
protected static void RemoveFromCache(EntryInfo entryInfo)
{
while (_CacheList.Contains(entryInfo)) _CacheList.Remove(entryInfo); // In RemoveFromCache
}
private static Dictionary<string, List<EntryInfo>> _CacheByPrimaryKey = new Dictionary<string, List<EntryInfo>>();
private static void ConvertListToDictionary()
{
List<EntryInfo> remove = new List<EntryInfo>();
foreach (EntryInfo tmp in _AllList)
foreach (EntryInfo tmp in _CacheList)
{
if (!_AllByPrimaryKey.ContainsKey(tmp.ContentID.ToString()))
if (!_CacheByPrimaryKey.ContainsKey(tmp.ContentID.ToString()))
{
_AllByPrimaryKey[tmp.ContentID.ToString()] = new List<EntryInfo>(); // Add new list for PrimaryKey
_CacheByPrimaryKey[tmp.ContentID.ToString()] = new List<EntryInfo>(); // Add new list for PrimaryKey
}
_AllByPrimaryKey[tmp.ContentID.ToString()].Add(tmp); // Add to Primary Key list
_CacheByPrimaryKey[tmp.ContentID.ToString()].Add(tmp); // Add to Primary Key list
remove.Add(tmp);
}
foreach (EntryInfo tmp in remove)
_AllList.Remove(tmp);
RemoveFromCache(tmp);
}
internal static void AddList(EntryInfoList lst)
{
foreach (EntryInfo item in lst) _AllList.Add(item);
foreach (EntryInfo item in lst) AddToCache(item);
}
public static EntryInfo GetExistingByPrimaryKey(int contentID)
protected static EntryInfo GetCachedByPrimaryKey(int contentID)
{
ConvertListToDictionary();
string key = contentID.ToString();
if (_AllByPrimaryKey.ContainsKey(key)) return _AllByPrimaryKey[key][0];
if (_CacheByPrimaryKey.ContainsKey(key)) return _CacheByPrimaryKey[key][0];
return null;
}
#endregion
@ -169,24 +177,23 @@ namespace VEPROMS.CSLA.Library
#endregion
#region Factory Methods
private static int _EntryInfoUnique = 0;
private int _MyEntryInfoUnique;
private static int EntryInfoUnique
{ get { return ++_EntryInfoUnique; } }
private int _MyEntryInfoUnique = EntryInfoUnique;
public int MyEntryInfoUnique
{
get { return _MyEntryInfoUnique; }
}
private EntryInfo()
{ get { return _MyEntryInfoUnique; } }
protected EntryInfo()
{/* require use of factory methods */
_MyEntryInfoUnique = ++_EntryInfoUnique;
_AllList.Add(this);
AddToCache(this);
}
public void Dispose()
{
_AllList.Remove(this);
if (!_AllByPrimaryKey.ContainsKey(ContentID.ToString())) return;
List<EntryInfo> listEntryInfo = _AllByPrimaryKey[ContentID.ToString()]; // Get the list of items
listEntryInfo.Remove(this); // Remove the item from the list
RemoveFromCache(this);
if (!_CacheByPrimaryKey.ContainsKey(ContentID.ToString())) return;
List<EntryInfo> listEntryInfo = _CacheByPrimaryKey[ContentID.ToString()]; // Get the list of items
while (listEntryInfo.Contains(this)) listEntryInfo.Remove(this); // Remove the item from the list
if (listEntryInfo.Count == 0) // If there are no items left in the list
_AllByPrimaryKey.Remove(ContentID.ToString()); // remove the list
_CacheByPrimaryKey.Remove(ContentID.ToString()); // remove the list
}
public virtual Entry Get()
{
@ -196,15 +203,15 @@ namespace VEPROMS.CSLA.Library
{
string key = tmp.ContentID.ToString();
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(key))
foreach (EntryInfo tmpInfo in _AllByPrimaryKey[key])
if (_CacheByPrimaryKey.ContainsKey(key))
foreach (EntryInfo tmpInfo in _CacheByPrimaryKey[key])
tmpInfo.RefreshFields(tmp);
}
private void RefreshFields(Entry tmp)
protected virtual void RefreshFields(Entry tmp)
{
if (_DocID != tmp.DocID)
{
MyDocument.RefreshDocumentEntries(); // Update List for old value
if (MyDocument != null) MyDocument.RefreshDocumentEntries(); // Update List for old value
_DocID = tmp.DocID; // Update the value
}
_MyDocument = null; // Reset list so that the next line gets a new list
@ -220,11 +227,11 @@ namespace VEPROMS.CSLA.Library
{
string key = tmp.ContentID.ToString();
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(key))
foreach (EntryInfo tmpInfo in _AllByPrimaryKey[key])
if (_CacheByPrimaryKey.ContainsKey(key))
foreach (EntryInfo tmpInfo in _CacheByPrimaryKey[key])
tmpInfo.RefreshFields(tmp);
}
private void RefreshFields(DocumentEntry tmp)
protected virtual void RefreshFields(DocumentEntry tmp)
{
_DTS = tmp.DTS;
_UserID = tmp.UserID;
@ -239,15 +246,16 @@ namespace VEPROMS.CSLA.Library
// throw new System.Security.SecurityException("User not authorized to view a Entry");
try
{
EntryInfo tmp = GetExistingByPrimaryKey(contentID);
EntryInfo tmp = GetCachedByPrimaryKey(contentID);
if (tmp == null)
{
tmp = DataPortal.Fetch<EntryInfo>(new PKCriteria(contentID));
if (!_AllList.Contains(tmp)) _AllList.Add(tmp);
AddToCache(tmp);
}
if (tmp.ErrorMessage == "No Record Found")
{
tmp._ContentID = contentID;
tmp.Dispose(); // Clean-up EntryInfo
tmp = null;
}
return tmp;
}
@ -260,7 +268,6 @@ namespace VEPROMS.CSLA.Library
#region Data Access Portal
internal EntryInfo(SafeDataReader dr)
{
_MyEntryInfoUnique = ++_EntryInfoUnique;
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] EntryInfo.Constructor", GetHashCode());
try
{

View File

@ -86,38 +86,46 @@ namespace VEPROMS.CSLA.Library
}
#endregion
#region Collection
protected static List<Folder> _AllList = new List<Folder>();
private static Dictionary<string, List<Folder>> _AllByPrimaryKey = new Dictionary<string, List<Folder>>();
private static Dictionary<string, List<Folder>> _AllByParentID_Name = new Dictionary<string, List<Folder>>();
private static List<Folder> _CacheList = new List<Folder>();
protected static void AddToCache(Folder folder)
{
if (!_CacheList.Contains(folder)) _CacheList.Add(folder); // In AddToCache
}
protected static void RemoveFromCache(Folder folder)
{
while (_CacheList.Contains(folder)) _CacheList.Remove(folder); // In RemoveFromCache
}
private static Dictionary<string, List<Folder>> _CacheByPrimaryKey = new Dictionary<string, List<Folder>>();
private static Dictionary<string, List<Folder>> _CacheByParentID_Name = new Dictionary<string, List<Folder>>();
private static void ConvertListToDictionary()
{
List<Folder> remove = new List<Folder>();
foreach (Folder tmp in _AllList)
foreach (Folder tmp in _CacheList)
{
if (!_AllByPrimaryKey.ContainsKey(tmp.FolderID.ToString()))
if (!_CacheByPrimaryKey.ContainsKey(tmp.FolderID.ToString()))
{
_AllByPrimaryKey[tmp.FolderID.ToString()] = new List<Folder>(); // Add new list for PrimaryKey
_AllByParentID_Name[tmp.ParentID.ToString() + "_" + tmp.Name.ToString()] = new List<Folder>(); // Add new list for ParentID_Name
_CacheByPrimaryKey[tmp.FolderID.ToString()] = new List<Folder>(); // Add new list for PrimaryKey
_CacheByParentID_Name[tmp.ParentID.ToString() + "_" + tmp.Name.ToString()] = new List<Folder>(); // Add new list for ParentID_Name
}
_AllByPrimaryKey[tmp.FolderID.ToString()].Add(tmp); // Add to Primary Key list
_AllByParentID_Name[tmp.ParentID.ToString() + "_" + tmp.Name.ToString()].Add(tmp); // Unique Index
_CacheByPrimaryKey[tmp.FolderID.ToString()].Add(tmp); // Add to Primary Key list
_CacheByParentID_Name[tmp.ParentID.ToString() + "_" + tmp.Name.ToString()].Add(tmp); // Unique Index
remove.Add(tmp);
}
foreach (Folder tmp in remove)
_AllList.Remove(tmp);
RemoveFromCache(tmp);
}
public static Folder GetExistingByPrimaryKey(int folderID)
protected static Folder GetCachedByPrimaryKey(int folderID)
{
ConvertListToDictionary();
string key = folderID.ToString();
if (_AllByPrimaryKey.ContainsKey(key)) return _AllByPrimaryKey[key][0];
if (_CacheByPrimaryKey.ContainsKey(key)) return _CacheByPrimaryKey[key][0];
return null;
}
public static Folder GetExistingByParentID_Name(int parentID, string name)
protected static Folder GetCachedByParentID_Name(int parentID, string name)
{
ConvertListToDictionary();
string key = parentID.ToString() + "_" + name.ToString();
if (_AllByParentID_Name.ContainsKey(key)) return _AllByParentID_Name[key][0];
if (_CacheByParentID_Name.ContainsKey(key)) return _CacheByParentID_Name[key][0];
return null;
}
#endregion
@ -295,7 +303,7 @@ namespace VEPROMS.CSLA.Library
set
{
CanWriteProperty("MyFormat", true);
if (_MyFormat != value)
if ((_MyFormat == null ? _FormatID : (int?)_MyFormat.FormatID) != (value == null ? null : (int?)value.FormatID))
{
_MyFormat = value;
_FormatID = (value == null ? null : (int?)value.FormatID);
@ -303,6 +311,26 @@ namespace VEPROMS.CSLA.Library
}
}
}
private double? _ManualOrder;
public double? ManualOrder
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty("ManualOrder", true);
return _ManualOrder;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
set
{
CanWriteProperty("ManualOrder", true);
if (_ManualOrder != value)
{
_ManualOrder = value;
PropertyHasChanged();
}
}
}
private string _Config = string.Empty;
public string Config
{
@ -586,6 +614,7 @@ namespace VEPROMS.CSLA.Library
//AuthorizationRules.AllowRead(Title, "<Role(s)>");
//AuthorizationRules.AllowRead(ShortName, "<Role(s)>");
//AuthorizationRules.AllowRead(FormatID, "<Role(s)>");
//AuthorizationRules.AllowRead(ManualOrder, "<Role(s)>");
//AuthorizationRules.AllowRead(Config, "<Role(s)>");
//AuthorizationRules.AllowRead(DTS, "<Role(s)>");
//AuthorizationRules.AllowRead(UsrID, "<Role(s)>");
@ -595,6 +624,7 @@ namespace VEPROMS.CSLA.Library
//AuthorizationRules.AllowWrite(Title, "<Role(s)>");
//AuthorizationRules.AllowWrite(ShortName, "<Role(s)>");
//AuthorizationRules.AllowWrite(FormatID, "<Role(s)>");
//AuthorizationRules.AllowWrite(ManualOrder, "<Role(s)>");
//AuthorizationRules.AllowWrite(Config, "<Role(s)>");
//AuthorizationRules.AllowWrite(DTS, "<Role(s)>");
//AuthorizationRules.AllowWrite(UsrID, "<Role(s)>");
@ -651,28 +681,41 @@ namespace VEPROMS.CSLA.Library
public int CurrentEditLevel
{ get { return EditLevel; } }
private static int _FolderUnique = 0;
private int _MyFolderUnique;
protected static int FolderUnique
{ get { return ++_FolderUnique; } }
private int _MyFolderUnique = FolderUnique;
public int MyFolderUnique
{
get { return _MyFolderUnique; }
}
{ get { return _MyFolderUnique; } }
protected Folder()
{/* require use of factory methods */
_MyFolderUnique = ++_FolderUnique;
_AllList.Add(this);
AddToCache(this);
}
public void Dispose()
{
_AllList.Remove(this);
if (!_AllByPrimaryKey.ContainsKey(FolderID.ToString())) return;
List<Folder> listFolder = _AllByPrimaryKey[FolderID.ToString()]; // Get the list of items
listFolder.Remove(this); // Remove the item from the list
if (listFolder.Count == 0) //If there are no items left in the list
_AllByPrimaryKey.Remove(FolderID.ToString()); // remove the list
listFolder = _AllByParentID_Name[FolderID.ToString()]; // Get the list of items
listFolder.Remove(this); // Remove the item from the list
if (listFolder.Count == 0) //If there are no items left in the list
_AllByParentID_Name.Remove(FolderID.ToString()); // remove the list
RemoveFromDictionaries();
}
private void RemoveFromDictionaries()
{
RemoveFromCache(this);
if (_CacheByPrimaryKey.ContainsKey(FolderID.ToString()))
{
List<Folder> listFolder = _CacheByPrimaryKey[FolderID.ToString()]; // Get the list of items
while (listFolder.Contains(this)) listFolder.Remove(this); // Remove the item from the list
if (listFolder.Count == 0) //If there are no items left in the list
_CacheByPrimaryKey.Remove(FolderID.ToString()); // remove the list
}
string myKey;
myKey = null;
foreach (string key in _CacheByParentID_Name.Keys)
if (_CacheByParentID_Name[key].Contains(this))
myKey = key;
if (myKey != null)
{
List<Folder> listFolder = _CacheByParentID_Name[myKey]; // Get the list of items
listFolder.Remove(this); // Remove the item from the list
if (listFolder.Count == 0) //If there are no items left in the list
_CacheByParentID_Name.Remove(myKey); // remove the list
}
}
public static Folder New()
{
@ -695,7 +738,7 @@ namespace VEPROMS.CSLA.Library
tmp.ShortName = shortName;
return tmp;
}
public static Folder New(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, string config, DateTime dts, string usrID)
public static Folder New(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config, DateTime dts, string usrID)
{
Folder tmp = Folder.New();
tmp.MyParent = myParent;
@ -704,16 +747,21 @@ namespace VEPROMS.CSLA.Library
tmp.Title = title;
tmp.ShortName = shortName;
tmp.MyFormat = myFormat;
tmp.ManualOrder = manualOrder;
tmp.Config = config;
tmp.DTS = dts;
tmp.UsrID = usrID;
return tmp;
}
public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, string config, DateTime dts, string usrID)
public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config, DateTime dts, string usrID)
{
Folder tmp = Folder.New(myParent, myConnection, name, title, shortName, myFormat, config, dts, usrID);
Folder tmp = Folder.New(myParent, myConnection, name, title, shortName, myFormat, manualOrder, config, dts, usrID);
if (tmp.IsSavable)
tmp = tmp.Save();
{
Folder tmp2 = tmp;
tmp = tmp2.Save();
tmp2.Dispose();
}
else
{
Csla.Validation.BrokenRulesCollection brc = tmp.ValidationRules.GetBrokenRules();
@ -725,7 +773,7 @@ namespace VEPROMS.CSLA.Library
}
return tmp;
}
public static Folder New(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, string config)
public static Folder New(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config)
{
Folder tmp = Folder.New();
tmp.MyParent = myParent;
@ -734,14 +782,19 @@ namespace VEPROMS.CSLA.Library
tmp.Title = title;
tmp.ShortName = shortName;
tmp.MyFormat = myFormat;
tmp.ManualOrder = manualOrder;
tmp.Config = config;
return tmp;
}
public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, string config)
public static Folder MakeFolder(Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config)
{
Folder tmp = Folder.New(myParent, myConnection, name, title, shortName, myFormat, config);
Folder tmp = Folder.New(myParent, myConnection, name, title, shortName, myFormat, manualOrder, config);
if (tmp.IsSavable)
tmp = tmp.Save();
{
Folder tmp2 = tmp;
tmp = tmp2.Save();
tmp2.Dispose();
}
else
{
Csla.Validation.BrokenRulesCollection brc = tmp.ValidationRules.GetBrokenRules();
@ -759,13 +812,17 @@ namespace VEPROMS.CSLA.Library
throw new System.Security.SecurityException("User not authorized to view a Folder");
try
{
Folder tmp = GetExistingByPrimaryKey(folderID);
Folder tmp = GetCachedByPrimaryKey(folderID);
if (tmp == null)
{
tmp = DataPortal.Fetch<Folder>(new PKCriteria(folderID));
if (!_AllList.Contains(tmp)) _AllList.Add(tmp);
AddToCache(tmp);
}
if (tmp.ErrorMessage == "No Record Found")
{
tmp.Dispose(); // Clean-up Folder
tmp = null;
}
if (tmp.ErrorMessage == "No Record Found") tmp = null;
return tmp;
}
catch (Exception ex)
@ -773,19 +830,23 @@ namespace VEPROMS.CSLA.Library
throw new DbCslaException("Error on Folder.Get", ex);
}
}
private static Folder GetByParentID_Name(int parentID, string name)
public static Folder GetByParentID_Name(int parentID, string name)
{
if (!CanGetObject())
throw new System.Security.SecurityException("User not authorized to view a Folder");
try
{
Folder tmp = GetExistingByParentID_Name(parentID, name);
Folder tmp = GetCachedByParentID_Name(parentID, name);
if (tmp == null)
{
tmp = DataPortal.Fetch<Folder>(new ParentID_NameCriteria(parentID, name));
if (!_AllList.Contains(tmp)) _AllList.Add(tmp);
AddToCache(tmp);
}
if (tmp.ErrorMessage == "No Record Found")
{
tmp.Dispose(); // Clean-up Folder
tmp = null;
}
if (tmp.ErrorMessage == "No Record Found") tmp = null;
return tmp;
}
catch (Exception ex)
@ -837,7 +898,8 @@ namespace VEPROMS.CSLA.Library
{
BuildRefreshList();
Folder folder = base.Save();
_AllList.Add(folder);//Refresh the item in AllList
RemoveFromDictionaries(); // if save is successful remove the previous Folder from the cache
AddToCache(folder);//Refresh the item in AllList
ProcessRefreshList();
return folder;
}
@ -899,6 +961,7 @@ namespace VEPROMS.CSLA.Library
_Title = dr.GetString("Title");
_ShortName = dr.GetString("ShortName");
_FormatID = (int?)dr.GetValue("FormatID");
_ManualOrder = (double?)dr.GetValue("ManualOrder");
_Config = dr.GetString("Config");
_DTS = dr.GetDateTime("DTS");
_UsrID = dr.GetString("UsrID");
@ -1037,6 +1100,7 @@ namespace VEPROMS.CSLA.Library
cm.Parameters.AddWithValue("@Title", _Title);
cm.Parameters.AddWithValue("@ShortName", _ShortName);
cm.Parameters.AddWithValue("@FormatID", FormatID);
cm.Parameters.AddWithValue("@ManualOrder", _ManualOrder);
cm.Parameters.AddWithValue("@Config", _Config);
if (_DTS.Year >= 1753 && _DTS.Year <= 9999) cm.Parameters.AddWithValue("@DTS", _DTS);
cm.Parameters.AddWithValue("@UsrID", _UsrID);
@ -1068,7 +1132,7 @@ namespace VEPROMS.CSLA.Library
}
}
[Transactional(TransactionalTypes.TransactionScope)]
public static byte[] Add(SqlConnection cn, ref int folderID, Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, string config, DateTime dts, string usrID)
public static byte[] Add(SqlConnection cn, ref int folderID, Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config, DateTime dts, string usrID)
{
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] Folder.Add", 0);
try
@ -1084,6 +1148,7 @@ namespace VEPROMS.CSLA.Library
cm.Parameters.AddWithValue("@Title", title);
cm.Parameters.AddWithValue("@ShortName", shortName);
if (myFormat != null) cm.Parameters.AddWithValue("@FormatID", myFormat.FormatID);
cm.Parameters.AddWithValue("@ManualOrder", manualOrder);
cm.Parameters.AddWithValue("@Config", config);
if (dts.Year >= 1753 && dts.Year <= 9999) cm.Parameters.AddWithValue("@DTS", dts);
cm.Parameters.AddWithValue("@UsrID", usrID);
@ -1154,6 +1219,7 @@ namespace VEPROMS.CSLA.Library
cm.Parameters.AddWithValue("@Title", _Title);
cm.Parameters.AddWithValue("@ShortName", _ShortName);
cm.Parameters.AddWithValue("@FormatID", FormatID);
cm.Parameters.AddWithValue("@ManualOrder", _ManualOrder);
cm.Parameters.AddWithValue("@Config", _Config);
if (_DTS.Year >= 1753 && _DTS.Year <= 9999) cm.Parameters.AddWithValue("@DTS", _DTS);
cm.Parameters.AddWithValue("@UsrID", _UsrID);
@ -1188,9 +1254,9 @@ namespace VEPROMS.CSLA.Library
{
SqlConnection cn = (SqlConnection)ApplicationContext.LocalContext["cn"];
if (IsNew)
_LastChanged = Folder.Add(cn, ref _FolderID, _MyParent, _MyConnection, _Name, _Title, _ShortName, _MyFormat, _Config, _DTS, _UsrID);
_LastChanged = Folder.Add(cn, ref _FolderID, _MyParent, _MyConnection, _Name, _Title, _ShortName, _MyFormat, _ManualOrder, _Config, _DTS, _UsrID);
else
_LastChanged = Folder.Update(cn, ref _FolderID, _MyParent, _MyConnection, _Name, _Title, _ShortName, _MyFormat, _Config, _DTS, _UsrID, ref _LastChanged);
_LastChanged = Folder.Update(cn, ref _FolderID, _MyParent, _MyConnection, _Name, _Title, _ShortName, _MyFormat, _ManualOrder, _Config, _DTS, _UsrID, ref _LastChanged);
MarkOld();
}
if (_FolderAssignments != null) _FolderAssignments.Update(this);
@ -1208,7 +1274,7 @@ namespace VEPROMS.CSLA.Library
MarkNew();
}
[Transactional(TransactionalTypes.TransactionScope)]
public static byte[] Update(SqlConnection cn, ref int folderID, Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, string config, DateTime dts, string usrID, ref byte[] lastChanged)
public static byte[] Update(SqlConnection cn, ref int folderID, Folder myParent, Connection myConnection, string name, string title, string shortName, Format myFormat, double? manualOrder, string config, DateTime dts, string usrID, ref byte[] lastChanged)
{
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] Folder.Update", 0);
try
@ -1225,6 +1291,7 @@ namespace VEPROMS.CSLA.Library
cm.Parameters.AddWithValue("@Title", title);
cm.Parameters.AddWithValue("@ShortName", shortName);
if (myFormat != null) cm.Parameters.AddWithValue("@FormatID", myFormat.FormatID);
cm.Parameters.AddWithValue("@ManualOrder", manualOrder);
cm.Parameters.AddWithValue("@Config", config);
if (dts.Year >= 1753 && dts.Year <= 9999) cm.Parameters.AddWithValue("@DTS", dts);
cm.Parameters.AddWithValue("@UsrID", usrID);

View File

@ -149,7 +149,7 @@ namespace VEPROMS.CSLA.Library
set
{
CanWriteProperty("MyItem", true);
if (_MyItem != value)
if ((_MyItem == null ? _ItemID : (int?)_MyItem.ItemID) != (value == null ? null : (int?)value.ItemID))
{
_MyItem = value;
_ItemID = (value == null ? null : (int?)value.ItemID);
@ -182,7 +182,7 @@ namespace VEPROMS.CSLA.Library
set
{
CanWriteProperty("MyFormat", true);
if (_MyFormat != value)
if ((_MyFormat == null ? _FormatID : (int?)_MyFormat.FormatID) != (value == null ? null : (int?)value.FormatID))
{
_MyFormat = value;
_FormatID = (value == null ? null : (int?)value.FormatID);

View File

@ -36,32 +36,40 @@ namespace VEPROMS.CSLA.Library
private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
#endregion
#region Collection
protected static List<FolderInfo> _AllList = new List<FolderInfo>();
private static Dictionary<string, List<FolderInfo>> _AllByPrimaryKey = new Dictionary<string, List<FolderInfo>>();
private static List<FolderInfo> _CacheList = new List<FolderInfo>();
protected static void AddToCache(FolderInfo folderInfo)
{
if (!_CacheList.Contains(folderInfo)) _CacheList.Add(folderInfo); // In AddToCache
}
protected static void RemoveFromCache(FolderInfo folderInfo)
{
while (_CacheList.Contains(folderInfo)) _CacheList.Remove(folderInfo); // In RemoveFromCache
}
private static Dictionary<string, List<FolderInfo>> _CacheByPrimaryKey = new Dictionary<string, List<FolderInfo>>();
private static void ConvertListToDictionary()
{
List<FolderInfo> remove = new List<FolderInfo>();
foreach (FolderInfo tmp in _AllList)
foreach (FolderInfo tmp in _CacheList)
{
if (!_AllByPrimaryKey.ContainsKey(tmp.FolderID.ToString()))
if (!_CacheByPrimaryKey.ContainsKey(tmp.FolderID.ToString()))
{
_AllByPrimaryKey[tmp.FolderID.ToString()] = new List<FolderInfo>(); // Add new list for PrimaryKey
_CacheByPrimaryKey[tmp.FolderID.ToString()] = new List<FolderInfo>(); // Add new list for PrimaryKey
}
_AllByPrimaryKey[tmp.FolderID.ToString()].Add(tmp); // Add to Primary Key list
_CacheByPrimaryKey[tmp.FolderID.ToString()].Add(tmp); // Add to Primary Key list
remove.Add(tmp);
}
foreach (FolderInfo tmp in remove)
_AllList.Remove(tmp);
RemoveFromCache(tmp);
}
internal static void AddList(FolderInfoList lst)
{
foreach (FolderInfo item in lst) _AllList.Add(item);
foreach (FolderInfo item in lst) AddToCache(item);
}
public static FolderInfo GetExistingByPrimaryKey(int folderID)
protected static FolderInfo GetCachedByPrimaryKey(int folderID)
{
ConvertListToDictionary();
string key = folderID.ToString();
if (_AllByPrimaryKey.ContainsKey(key)) return _AllByPrimaryKey[key][0];
if (_CacheByPrimaryKey.ContainsKey(key)) return _CacheByPrimaryKey[key][0];
return null;
}
#endregion
@ -189,6 +197,16 @@ namespace VEPROMS.CSLA.Library
return _MyFormat;
}
}
private double? _ManualOrder;
public double? ManualOrder
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
get
{
CanReadProperty("ManualOrder", true);
return _ManualOrder;
}
}
private string _Config = string.Empty;
public string Config
{
@ -247,11 +265,11 @@ namespace VEPROMS.CSLA.Library
return _FolderAssignments;
}
}
internal void RefreshFolderAssignments()
public void RefreshFolderAssignments()
{
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(_FolderID.ToString()))
foreach (FolderInfo tmp in _AllByPrimaryKey[_FolderID.ToString()])
if (_CacheByPrimaryKey.ContainsKey(_FolderID.ToString()))
foreach (FolderInfo tmp in _CacheByPrimaryKey[_FolderID.ToString()])
tmp._FolderAssignmentCount = -1; // This will cause the data to be requeried
}
private int _FolderDocVersionCount = 0;
@ -282,11 +300,11 @@ namespace VEPROMS.CSLA.Library
return _FolderDocVersions;
}
}
internal void RefreshFolderDocVersions()
public void RefreshFolderDocVersions()
{
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(_FolderID.ToString()))
foreach (FolderInfo tmp in _AllByPrimaryKey[_FolderID.ToString()])
if (_CacheByPrimaryKey.ContainsKey(_FolderID.ToString()))
foreach (FolderInfo tmp in _CacheByPrimaryKey[_FolderID.ToString()])
tmp._FolderDocVersionCount = -1; // This will cause the data to be requeried
}
private int _ChildFolderCount = 0;
@ -317,11 +335,11 @@ namespace VEPROMS.CSLA.Library
return _ChildFolders;
}
}
internal void RefreshChildFolders()
public void RefreshChildFolders()
{
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(_FolderID.ToString()))
foreach (FolderInfo tmp in _AllByPrimaryKey[_FolderID.ToString()])
if (_CacheByPrimaryKey.ContainsKey(_FolderID.ToString()))
foreach (FolderInfo tmp in _CacheByPrimaryKey[_FolderID.ToString()])
tmp._ChildFolderCount = -1; // This will cause the data to be requeried
}
// TODO: Replace base FolderInfo.ToString function as necessary
@ -345,24 +363,23 @@ namespace VEPROMS.CSLA.Library
#endregion
#region Factory Methods
private static int _FolderInfoUnique = 0;
private int _MyFolderInfoUnique;
private static int FolderInfoUnique
{ get { return ++_FolderInfoUnique; } }
private int _MyFolderInfoUnique = FolderInfoUnique;
public int MyFolderInfoUnique
{
get { return _MyFolderInfoUnique; }
}
private FolderInfo()
{ get { return _MyFolderInfoUnique; } }
protected FolderInfo()
{/* require use of factory methods */
_MyFolderInfoUnique = ++_FolderInfoUnique;
_AllList.Add(this);
AddToCache(this);
}
public void Dispose()
{
_AllList.Remove(this);
if (!_AllByPrimaryKey.ContainsKey(FolderID.ToString())) return;
List<FolderInfo> listFolderInfo = _AllByPrimaryKey[FolderID.ToString()]; // Get the list of items
listFolderInfo.Remove(this); // Remove the item from the list
RemoveFromCache(this);
if (!_CacheByPrimaryKey.ContainsKey(FolderID.ToString())) return;
List<FolderInfo> listFolderInfo = _CacheByPrimaryKey[FolderID.ToString()]; // Get the list of items
while (listFolderInfo.Contains(this)) listFolderInfo.Remove(this); // Remove the item from the list
if (listFolderInfo.Count == 0) // If there are no items left in the list
_AllByPrimaryKey.Remove(FolderID.ToString()); // remove the list
_CacheByPrimaryKey.Remove(FolderID.ToString()); // remove the list
}
public virtual Folder Get()
{
@ -372,22 +389,22 @@ namespace VEPROMS.CSLA.Library
{
string key = tmp.FolderID.ToString();
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(key))
foreach (FolderInfo tmpInfo in _AllByPrimaryKey[key])
if (_CacheByPrimaryKey.ContainsKey(key))
foreach (FolderInfo tmpInfo in _CacheByPrimaryKey[key])
tmpInfo.RefreshFields(tmp);
}
private void RefreshFields(Folder tmp)
protected virtual void RefreshFields(Folder tmp)
{
if (_ParentID != tmp.ParentID)
{
MyParent.RefreshChildFolders(); // Update List for old value
if (MyParent != null) MyParent.RefreshChildFolders(); // Update List for old value
_ParentID = tmp.ParentID; // Update the value
}
_MyParent = null; // Reset list so that the next line gets a new list
if (MyParent != null) MyParent.RefreshChildFolders(); // Update List for new value
if (_DBID != tmp.DBID)
{
MyConnection.RefreshConnectionFolders(); // Update List for old value
if (MyConnection != null) MyConnection.RefreshConnectionFolders(); // Update List for old value
_DBID = tmp.DBID; // Update the value
}
_MyConnection = null; // Reset list so that the next line gets a new list
@ -397,11 +414,12 @@ namespace VEPROMS.CSLA.Library
_ShortName = tmp.ShortName;
if (_FormatID != tmp.FormatID)
{
MyFormat.RefreshFormatFolders(); // Update List for old value
if (MyFormat != null) MyFormat.RefreshFormatFolders(); // Update List for old value
_FormatID = tmp.FormatID; // Update the value
}
_MyFormat = null; // Reset list so that the next line gets a new list
if (MyFormat != null) MyFormat.RefreshFormatFolders(); // Update List for new value
_ManualOrder = tmp.ManualOrder;
_Config = tmp.Config;
_DTS = tmp.DTS;
_UsrID = tmp.UsrID;
@ -415,15 +433,15 @@ namespace VEPROMS.CSLA.Library
{
string key = tmp.FolderID.ToString();
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(key))
foreach (FolderInfo tmpInfo in _AllByPrimaryKey[key])
if (_CacheByPrimaryKey.ContainsKey(key))
foreach (FolderInfo tmpInfo in _CacheByPrimaryKey[key])
tmpInfo.RefreshFields(tmp);
}
private void RefreshFields(ConnectionFolder tmp)
protected virtual void RefreshFields(ConnectionFolder tmp)
{
if (_ParentID != tmp.ParentID)
{
MyParent.RefreshChildFolders(); // Update List for old value
if (MyParent != null) MyParent.RefreshChildFolders(); // Update List for old value
_ParentID = tmp.ParentID; // Update the value
}
_MyParent = null; // Reset list so that the next line gets a new list
@ -433,11 +451,12 @@ namespace VEPROMS.CSLA.Library
_ShortName = tmp.ShortName;
if (_FormatID != tmp.FormatID)
{
MyFormat.RefreshFormatFolders(); // Update List for old value
if (MyFormat != null) MyFormat.RefreshFormatFolders(); // Update List for old value
_FormatID = tmp.FormatID; // Update the value
}
_MyFormat = null; // Reset list so that the next line gets a new list
if (MyFormat != null) MyFormat.RefreshFormatFolders(); // Update List for new value
_ManualOrder = tmp.ManualOrder;
_Config = tmp.Config;
_DTS = tmp.DTS;
_UsrID = tmp.UsrID;
@ -451,22 +470,22 @@ namespace VEPROMS.CSLA.Library
{
string key = tmp.FolderID.ToString();
ConvertListToDictionary();
if (_AllByPrimaryKey.ContainsKey(key))
foreach (FolderInfo tmpInfo in _AllByPrimaryKey[key])
if (_CacheByPrimaryKey.ContainsKey(key))
foreach (FolderInfo tmpInfo in _CacheByPrimaryKey[key])
tmpInfo.RefreshFields(tmp);
}
private void RefreshFields(FormatFolder tmp)
protected virtual void RefreshFields(FormatFolder tmp)
{
if (_ParentID != tmp.ParentID)
{
MyParent.RefreshChildFolders(); // Update List for old value
if (MyParent != null) MyParent.RefreshChildFolders(); // Update List for old value
_ParentID = tmp.ParentID; // Update the value
}
_MyParent = null; // Reset list so that the next line gets a new list
if (MyParent != null) MyParent.RefreshChildFolders(); // Update List for new value
if (_DBID != tmp.DBID)
{
MyConnection.RefreshConnectionFolders(); // Update List for old value
if (MyConnection != null) MyConnection.RefreshConnectionFolders(); // Update List for old value
_DBID = tmp.DBID; // Update the value
}
_MyConnection = null; // Reset list so that the next line gets a new list
@ -474,6 +493,7 @@ namespace VEPROMS.CSLA.Library
_Name = tmp.Name;
_Title = tmp.Title;
_ShortName = tmp.ShortName;
_ManualOrder = tmp.ManualOrder;
_Config = tmp.Config;
_DTS = tmp.DTS;
_UsrID = tmp.UsrID;
@ -489,13 +509,17 @@ namespace VEPROMS.CSLA.Library
// throw new System.Security.SecurityException("User not authorized to view a Folder");
try
{
FolderInfo tmp = GetExistingByPrimaryKey(folderID);
FolderInfo tmp = GetCachedByPrimaryKey(folderID);
if (tmp == null)
{
tmp = DataPortal.Fetch<FolderInfo>(new PKCriteria(folderID));
if (!_AllList.Contains(tmp)) _AllList.Add(tmp);
AddToCache(tmp);
}
if (tmp.ErrorMessage == "No Record Found")
{
tmp.Dispose(); // Clean-up FolderInfo
tmp = null;
}
if (tmp.ErrorMessage == "No Record Found") tmp = null;
return tmp;
}
catch (Exception ex)
@ -507,7 +531,6 @@ namespace VEPROMS.CSLA.Library
#region Data Access Portal
internal FolderInfo(SafeDataReader dr)
{
_MyFolderInfoUnique = ++_FolderInfoUnique;
if (_MyLog.IsDebugEnabled) _MyLog.DebugFormat("[{0}] FolderInfo.Constructor", GetHashCode());
try
{
@ -542,6 +565,7 @@ namespace VEPROMS.CSLA.Library
_Title = dr.GetString("Title");
_ShortName = dr.GetString("ShortName");
_FormatID = (int?)dr.GetValue("FormatID");
_ManualOrder = (double?)dr.GetValue("ManualOrder");
_Config = dr.GetString("Config");
_DTS = dr.GetDateTime("DTS");
_UsrID = dr.GetString("UsrID");

View File

@ -97,38 +97,46 @@ namespace VEPROMS.CSLA.Library
}
#endregion
#region Collection
protected static List<Format> _AllList = new List<Format>();
private static Dictionary<string, List<Format>> _AllByPrimaryKey = new Dictionary<string, List<Format>>();
private static Dictionary<string, List<Format>> _AllByParentID_Name = new Dictionary<string, List<Format>>();
private static List<Format> _CacheList = new List<Format>();
protected static void AddToCache(Format format)
{
if (!_CacheList.Contains(format)) _CacheList.Add(format); // In AddToCache
}
protected static void RemoveFromCache(Format format)
{
while (_CacheList.Contains(format)) _CacheList.Remove(format); // In RemoveFromCache
}
private static Dictionary<string, List<Format>> _CacheByPrimaryKey = new Dictionary<string, List<Format>>();
private static Dictionary<string, List<Format>> _CacheByParentID_Name = new Dictionary<string, List<Format>>();
private static void ConvertListToDictionary()
{
List<Format> remove = new List<Format>();
foreach (Format tmp in _AllList)
foreach (Format tmp in _CacheList)
{
if (!_AllByPrimaryKey.ContainsKey(tmp.FormatID.ToString()))
if (!_CacheByPrimaryKey.ContainsKey(tmp.FormatID.ToString()))
{
_AllByPrimaryKey[tmp.FormatID.ToString()] = new List<Format>(); // Add new list for PrimaryKey
_AllByParentID_Name[tmp.ParentID.ToString() + "_" + tmp.Name.ToString()] = new List<Format>(); // Add new list for ParentID_Name
_CacheByPrimaryKey[tmp.FormatID.ToString()] = new List<Format>(); // Add new list for PrimaryKey
_CacheByParentID_Name[tmp.ParentID.ToString() + "_" + tmp.Name.ToString()] = new List<Format>(); // Add new list for ParentID_Name
}
_AllByPrimaryKey[tmp.FormatID.ToString()].Add(tmp); // Add to Primary Key list
_AllByParentID_Name[tmp.ParentID.ToString() + "_" + tmp.Name.ToString()].Add(tmp); // Unique Index
_CacheByPrimaryKey[tmp.FormatID.ToString()].Add(tmp); // Add to Primary Key list
_CacheByParentID_Name[tmp.ParentID.ToString() + "_" + tmp.Name.ToString()].Add(tmp); // Unique Index
remove.Add(tmp);
}
foreach (Format tmp in remove)
_AllList.Remove(tmp);
RemoveFromCache(tmp);
}
public static Format GetExistingByPrimaryKey(int formatID)
protected static Format GetCachedByPrimaryKey(int formatID)
{
ConvertListToDictionary();
string key = formatID.ToString();
if (_AllByPrimaryKey.ContainsKey(key)) return _AllByPrimaryKey[key][0];
if (_CacheByPrimaryKey.ContainsKey(key)) return _CacheByPrimaryKey[key][0];
return null;
}
public static Format GetExistingByParentID_Name(int parentID, string name)
protected static Format GetCachedByParentID_Name(int parentID, string name)
{
ConvertListToDictionary();
string key = parentID.ToString() + "_" + name.ToString();
if (_AllByParentID_Name.ContainsKey(key)) return _AllByParentID_Name[key][0];
if (_CacheByParentID_Name.ContainsKey(key)) return _CacheByParentID_Name[key][0];
return null;
}
#endregion
@ -614,28 +622,41 @@ namespace VEPROMS.CSLA.Library
public int CurrentEditLevel
{ get { return EditLevel; } }
private static int _FormatUnique = 0;
private int _MyFormatUnique;
protected static int FormatUnique
{ get { return ++_FormatUnique; } }
private int _MyFormatUnique = FormatUnique;
public int MyFormatUnique
{
get { return _MyFormatUnique; }
}
{ get { return _MyFormatUnique; } }
protected Format()
{/* require use of factory methods */
_MyFormatUnique = ++_FormatUnique;
_AllList.Add(this);
AddToCache(this);
}
public void Dispose()
{
_AllList.Remove(this);
if (!_AllByPrimaryKey.ContainsKey(FormatID.ToString())) return;
List<Format> listFormat = _AllByPrimaryKey[FormatID.ToString()]; // Get the list of items
listFormat.Remove(this); // Remove the item from the list
if (listFormat.Count == 0) //If there are no items left in the list
_AllByPrimaryKey.Remove(FormatID.ToString()); // remove the list
listFormat = _AllByParentID_Name[FormatID.ToString()]; // Get the list of items
listFormat.Remove(this); // Remove the item from the list
if (listFormat.Count == 0) //If there are no items left in the list
_AllByParentID_Name.Remove(FormatID.ToString()); // remove the list
RemoveFromDictionaries();
}
private void RemoveFromDictionaries()
{
RemoveFromCache(this);
if (_CacheByPrimaryKey.ContainsKey(FormatID.ToString()))
{
List<Format> listFormat = _CacheByPrimaryKey[FormatID.ToString()]; // Get the list of items
while (listFormat.Contains(this)) listFormat.Remove(this); // Remove the item from the list
if (listFormat.Count == 0) //If there are no items left in the list
_CacheByPrimaryKey.Remove(FormatID.ToString()); // remove the list
}
string myKey;
myKey = null;
foreach (string key in _CacheByParentID_Name.Keys)
if (_CacheByParentID_Name[key].Contains(this))
myKey = key;
if (myKey != null)
{
List<Format> listFormat = _CacheByParentID_Name[myKey]; // Get the list of items
listFormat.Remove(this); // Remove the item from the list
if (listFormat.Count == 0) //If there are no items left in the list
_CacheByParentID_Name.Remove(myKey); // remove the list
}
}
public static Format New()
{
@ -674,7 +695,11 @@ namespace VEPROMS.CSLA.Library
{
Format tmp = Format.New(myParent, name, description, data, genMac, dts, userID);
if (tmp.IsSavable)
tmp = tmp.Save();
{
Format tmp2 = tmp;
tmp = tmp2.Save();
tmp2.Dispose();
}
else
{
Csla.Validation.BrokenRulesCollection brc = tmp.ValidationRules.GetBrokenRules();
@ -700,7 +725,11 @@ namespace VEPROMS.CSLA.Library
{
Format tmp = Format.New(myParent, name, description, data, genMac);
if (tmp.IsSavable)
tmp = tmp.Save();
{
Format tmp2 = tmp;
tmp = tmp2.Save();
tmp2.Dispose();
}
else
{
Csla.Validation.BrokenRulesCollection brc = tmp.ValidationRules.GetBrokenRules();
@ -718,13 +747,17 @@ namespace VEPROMS.CSLA.Library
throw new System.Security.SecurityException("User not authorized to view a Format");
try
{
Format tmp = GetExistingByPrimaryKey(formatID);
Format tmp = GetCachedByPrimaryKey(formatID);
if (tmp == null)
{
tmp = DataPortal.Fetch<Format>(new PKCriteria(formatID));
if (!_AllList.Contains(tmp)) _AllList.Add(tmp);
AddToCache(tmp);
}
if (tmp.ErrorMessage == "No Record Found")
{
tmp.Dispose(); // Clean-up Format
tmp = null;
}
if (tmp.ErrorMessage == "No Record Found") tmp = null;
return tmp;
}
catch (Exception ex)
@ -732,19 +765,23 @@ namespace VEPROMS.CSLA.Library
throw new DbCslaException("Error on Format.Get", ex);
}
}
private static Format GetByParentID_Name(int parentID, string name)
public static Format GetByParentID_Name(int parentID, string name)
{
if (!CanGetObject())
throw new System.Security.SecurityException("User not authorized to view a Format");
try
{
Format tmp = GetExistingByParentID_Name(parentID, name);
Format tmp = GetCachedByParentID_Name(parentID, name);
if (tmp == null)
{
tmp = DataPortal.Fetch<Format>(new ParentID_NameCriteria(parentID, name));
if (!_AllList.Contains(tmp)) _AllList.Add(tmp);
AddToCache(tmp);
}
if (tmp.ErrorMessage == "No Record Found")
{
tmp.Dispose(); // Clean-up Format
tmp = null;
}
if (tmp.ErrorMessage == "No Record Found") tmp = null;
return tmp;
}
catch (Exception ex)
@ -796,7 +833,8 @@ namespace VEPROMS.CSLA.Library
{
BuildRefreshList();
Format format = base.Save();
_AllList.Add(format);//Refresh the item in AllList
RemoveFromDictionaries(); // if save is successful remove the previous Folder from the cache
AddToCache(format);//Refresh the item in AllList
ProcessRefreshList();
return format;
}