SourceCode/PROMS/DataLoader/OutsideTransition.cs
John 1cc722cb67 Fixed logic to handle a user (sub) format as the procedure set default format
added more robust logic to handle outside transitions
supporting logic to add an additional annotation when multiple possibilities for an outside transition is possible
2013-06-12 19:00:37 +00:00

328 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
//using System.Collections.Specialized;
//using System.Collections.Generic;
//using System.Xml;
//using System.IO;
//using System.Text;
using VEPROMS.CSLA.Library;
namespace DataLoader
{
class OutsideTransition
{
private OleDbConnection _DbConnect;
public OleDbConnection DbConnect
{
get { return _DbConnect; }
set { _DbConnect = value; }
}
private Dictionary <string,ItemInfo> _TranLookup;
public OutsideTransition(OleDbConnection cn)
{
_DbConnect = cn;
_TranLookup = new Dictionary<string, ItemInfo>();
}
private List<string> _MigrationErrors;
public ItemInfo GetItem(string key, List<string> migrationErrors)
{
_MigrationErrors = migrationErrors;
if (!_TranLookup.ContainsKey(key))
_TranLookup.Add(key, Find(key));
return _TranLookup[key];
}
private ItemInfo Find(string key)
{
string setid = key.Substring(0, 8);
string procid = key.Substring(8, 8);
string path = GetPath(setid);// Get set path from XTSETID
string proc = GetProc(setid, procid);// Get procedure number from XTPROCID
return Find(path,proc);// Return ItemInfo based upon path and procedure number
}
private ItemInfo Find(string path, string proc)
{
return OTLookup.Find(path, proc,_MigrationErrors);
}
private string GetProc(string setid, string procid)
{
string retval = null;
string xtproccmd = "SELECT * FROM [xtprocid] WHERE [SETID]='" + setid + "' AND [PROCID]='" + procid + "'";
using (OleDbDataAdapter da = new OleDbDataAdapter(xtproccmd, _DbConnect))
{
try
{
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
dt.CaseSensitive = true;
DataRow dr = dt.Rows[0]; // there should be only one entry!
retval = dr["Procnum"].ToString(); // this should be the procedure number!
ds.Dispose();
}
catch (Exception ex)
{
return "<Procedure Number>";//ex.GetType().Name + " " + ex.Message;
}
}
return retval;
}
private string GetPath(string setid)
{
try
{
string xtsetcmd = "SELECT * FROM [xtsetid] WHERE [SETID]='" + setid + "'";
OleDbDataAdapter da = new OleDbDataAdapter(xtsetcmd, _DbConnect);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
dt.CaseSensitive = true;
DataRow dr = dt.Rows[0]; // there should be only one entry!
// if there are more than one entry use the first legitimate entry
// for NSP we found multiple "FIRST RECORD"s in numerious XTSETID.DBF files
if (dt.Rows.Count > 1)
{
int irow = 0;
while (irow < dt.Rows.Count-1 && dt.Rows[irow]["PLANTTITLE"].ToString() == "FIRST RECORD") irow++;
dr = dt.Rows[irow];
}
string retval = dr["Path"].ToString();
da.Dispose();
ds.Dispose();
return retval; // dr["Path"].ToString(); // this should be the path to the proc set!
}
catch (Exception ex)
{
return "<Procedure Set Location>";//ex.GetType().Name + " " + ex.Message;
}
}
private string GetTitle(string setid, string procid)
{
try
{
string xtproccmd = "SELECT * FROM [xtprocid] WHERE [SETID]='" + setid + "' AND [PROCID]='" + procid + "'";
OleDbDataAdapter da = new OleDbDataAdapter(xtproccmd, _DbConnect);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
dt.CaseSensitive = true;
DataRow dr = dt.Rows[0]; // there should be only one entry!
string retval = dr["Proctitle"].ToString();
da.Dispose();
ds.Dispose();
return retval; // dr["Proctitle"].ToString(); // this should be the procedure number!
}
catch (Exception ex)
{
return "<Procedure Title>";//ex.GetType().Name + " " + ex.Message;
}
}
public string GetDescription(string key)
{
string setid = key.Substring(0, 8);
string procid = key.Substring(8, 8);
string path = GetPath(setid);// Get set path from XTSETID
string proc = GetProc(setid, procid);// Get procedure number from XTPROCID
string title = GetTitle(setid, procid);// Get procedure title from XTPROCID
return string.Format("{0}, {1} in folder {2}",proc,title,path);
}
public string GetTransitionText(string key)
{
string setid = key.Substring(0, 8);
string procid = key.Substring(8, 8);
string proc = GetProc(setid, procid);// Get procedure number from XTPROCID
string title = GetTitle(setid, procid);// Get procedure title from XTPROCID
proc = proc.Replace("-", @"\u8209?"); // in proc number, replace dash and spaces with
proc = proc.Replace(" ", @"\u160?"); // nonbreak unicode dash & hardspace.
title = title.Replace("-", @"\u8209?"); // in title, just do the hardspace.
return string.Format("{0}, {1}", proc, title);
}
//private string ProcessOutSideTrans(OleDbConnection cn, string thekey, string pth)
//{
// string xtransstring = null;
// DataTable dt = null;
// DataSet ds = null;
// OleDbDataAdapter da = null;
// DataTable dt2 = null;
// DataSet ds2 = null;
// OleDbDataAdapter da2 = null;
// string tosetid = thekey.Substring(0, 8);
// string toprocid = thekey.Substring(8, 8);
// /// Get the path to the procedure set from the SETID
// string xtsetcmd = "SELECT * FROM [xtsetid] WHERE [SETID]='" + tosetid + "'";
// string xtproccmd = "SELECT * FROM [xtprocid] WHERE [SETID]='" + tosetid + "' AND [PROCID]='" + toprocid + "'";
// da = new OleDbDataAdapter(xtsetcmd, cn);
// da2 = new OleDbDataAdapter(xtproccmd, cn);
// // get xtsetid records.
// ds = new DataSet();
// try
// {
// da.Fill(ds);
// dt = ds.Tables[0];
// dt.CaseSensitive = true;
// }
// catch (Exception ex)
// {
// log.Error("Error getting XTSETID");
// log.ErrorFormat("to number = {0}", thekey);
// log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException);
// //return textm;
// }
// DataRow dr = dt.Rows[0]; // there should be only one entry!
// string setpth = dr["Path"].ToString(); // this should be the path to the proc set!
// // get xtprocid records
// ds2 = new DataSet();
// try
// {
// da2.Fill(ds2);
// dt2 = ds2.Tables[0];
// dt2.CaseSensitive = true;
// }
// catch (Exception ex)
// {
// log.Error("Error getting XTPROCID");
// log.ErrorFormat("to number = {0}", thekey);
// log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException);
// //return textm;
// }
// DataRow dr2 = dt2.Rows[0]; // there should be only one entry!
// string procnum = dr2["Procnum"].ToString(); // this should be the procedure number!
// xtransstring = setpth + "\\" + procnum; // ex: VEHLP\PROCS\0POP05-EO00
// //if (pathsAreEqual(setpth, pth))
// //{
// // // Outside Transiton is to this procedure set (not really outsde)
// // // need to find the item id that references the proc number and title
// // // - find the setpth in the doc.version
// //}
// //else
// //return thekey; // is a true outside transition
// return xtransstring;
//}
}
internal static class OTLookup
{
public static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private static Dictionary<string, ItemInfo> _Lookup = null;
static List<string> _MigrationErrors;
public static ItemInfo Find(string path, string procnum, List<string> migrationErrors)
{
_MigrationErrors = migrationErrors;
string key = string.Format(@"{0}\{1}",path,procnum);
if (_Lookup == null)
_Lookup = new Dictionary<string, ItemInfo>();
if (!_Lookup.ContainsKey(key))
_Lookup.Add(key, FindItem(path, procnum));
return _Lookup[key];
}
private static DocVersionInfoList _DocVersions = null;
private static ItemInfo FindItem(string path, string procnum)
{
if (_DocVersions == null)
_DocVersions = DocVersionInfoList.Get();
DocVersionInfo dvi = ExactMatch(path);
if (dvi == null) dvi = PartialMatch(path);
if (dvi != null) return FindItem(dvi, procnum);
return null;
}
private static ItemInfo FindItem(DocVersionInfo dvi, string procnum)
{
foreach (ItemInfo itm in dvi.Procedures)
if (itm.DisplayNumber == procnum)
return itm;
return null;
}
private static DocVersionInfo PartialMatch(string path)
{
string partial = GetPartial(path);
if (partial != null)
{
foreach (DocVersionInfo dvi in _DocVersions)
{
if (dvi.MyFolder.Title.ToUpper().EndsWith(partial.ToUpper()))
return dvi;
}
if (path.ToUpper().EndsWith("ABBYPROC"))
return PartialMatch(path + ".prc");
}
// if we cannot find a match using two folders, simple use one
partial = GetPartial2(path);
if (partial != null)
{
DocVersionInfo match = null;
foreach (DocVersionInfo dvi in _DocVersions)
{
if (dvi.MyFolder.Title.ToUpper().EndsWith(partial.ToUpper()))
{
if (match == null)
match = dvi;
else
{
_MyLog.WarnFormat("Duplicate external paths found for path '{0}'", path);
_MigrationErrors.Add(string.Format("Duplicate external paths found for path '{0}'", path));
}
}
}
}
return null;
}
private static string GetPartial(string path)
{
//Console.WriteLine(string.Format("GetPartial path = {0}",path));
if (path.Contains("\\"))
{
string[] parts = path.Split("\\".ToCharArray());
return "\\" + parts[parts.Length - 2] + "\\" + parts[parts.Length - 1];
}
else
return null;
}
private static string GetPartial2(string path)
{
//Console.WriteLine(string.Format("GetPartial path = {0}",path));
if (path.Contains("\\"))
{
string[] parts = path.Split("\\".ToCharArray());
return "\\" + parts[parts.Length - 1];
}
else
return null;
}
private static DocVersionInfo ExactMatch(string path)
{
foreach (DocVersionInfo dvi in _DocVersions)
if (dvi.MyFolder.Title.ToUpper().EndsWith(path.ToUpper()))
return dvi;
if (path.ToUpper().EndsWith("ABBYPROC"))
return ExactMatch(path + ".prc");
return null;
}
}
}