added more robust logic to handle outside transitions supporting logic to add an additional annotation when multiple possibilities for an outside transition is possible
328 lines
10 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|